<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Overview on OpAMP Commander</title><link>https://minuk.dev/opampcommander/docs/overview/</link><description>Recent content in Overview on OpAMP Commander</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://minuk.dev/opampcommander/docs/overview/index.xml" rel="self" type="application/rss+xml"/><item><title>OpAMP Protocol Sequence</title><link>https://minuk.dev/opampcommander/docs/overview/opamp-protocol-sequence/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://minuk.dev/opampcommander/docs/overview/opamp-protocol-sequence/</guid><description>&lt;h1 id="opamp-protocol-execution-sequence"&gt;OpAMP Protocol Execution Sequence&lt;/h1&gt;&#10;&lt;h2 id="agent-connection-and-message-exchange-flow"&gt;Agent Connection and Message Exchange Flow&lt;/h2&gt;&#10;&lt;pre class="mermaid"&gt;sequenceDiagram&#10; participant Agent as OpAMP Agent&#10; participant Controller as opamp.Controller&#10; participant OpAMPLib as OpAMP Server Lib&#10; participant Service as opamp.Service&#10; participant AgentUC as AgentUsecase&#10; participant ConnUC as ConnectionUsecase&#10; participant WS as WebSocketRegistry&#10; participant DB as MongoDB Repository&#10;&#10; Note over Agent,DB: Connection Phase&#10; &#10; Agent-&amp;gt;&amp;gt;Controller: GET/POST /api/v1/opamp&#10; Controller-&amp;gt;&amp;gt;OpAMPLib: handler(writer, request)&#10; OpAMPLib-&amp;gt;&amp;gt;Controller: OnConnecting(request)&#10; Controller--&amp;gt;&amp;gt;OpAMPLib: ConnectionResponse {Accept: true}&#10; OpAMPLib--&amp;gt;&amp;gt;Agent: Connection Accepted&#10; &#10; OpAMPLib-&amp;gt;&amp;gt;Service: OnConnected(ctx, connection)&#10; Service-&amp;gt;&amp;gt;Service: detectConnectionType(conn)&#10; Service-&amp;gt;&amp;gt;Service: NewConnection(conn, type)&#10; alt WebSocket&#10; Service-&amp;gt;&amp;gt;WS: Register(connID, wsConn)&#10; end&#10; Service-&amp;gt;&amp;gt;ConnUC: SaveConnection(ctx, connection)&#10; ConnUC-&amp;gt;&amp;gt;DB: Save&#10; &#10; Note over Agent,DB: Message Exchange Phase&#10; &#10; loop Active Connection&#10; Agent-&amp;gt;&amp;gt;OpAMPLib: AgentToServer Message&#10; Note right of Agent: - InstanceUID&amp;lt;br/&amp;gt;- AgentDescription&amp;lt;br/&amp;gt;- Health&amp;lt;br/&amp;gt;- Capabilities&amp;lt;br/&amp;gt;- EffectiveConfig&amp;lt;br/&amp;gt;- RemoteConfigStatus&amp;lt;br/&amp;gt;- PackageStatuses&#10; &#10; OpAMPLib-&amp;gt;&amp;gt;Service: OnMessage(ctx, conn, message)&#10; Service-&amp;gt;&amp;gt;ConnUC: GetConnectionByID(ctx, conn)&#10; ConnUC-&amp;gt;&amp;gt;DB: Find&#10; DB--&amp;gt;&amp;gt;ConnUC: connection&#10; ConnUC--&amp;gt;&amp;gt;Service: connection&#10; &#10; Service-&amp;gt;&amp;gt;Service: Update connection.InstanceUID&#10; alt WebSocket&#10; Service-&amp;gt;&amp;gt;WS: UpdateInstanceUID(connID, instanceUID)&#10; end&#10; Service-&amp;gt;&amp;gt;ConnUC: SaveConnection(ctx, connection)&#10; ConnUC-&amp;gt;&amp;gt;DB: Save&#10; &#10; Service-&amp;gt;&amp;gt;AgentUC: GetOrCreateAgent(ctx, instanceUID)&#10; AgentUC-&amp;gt;&amp;gt;DB: Find/Create&#10; DB--&amp;gt;&amp;gt;AgentUC: agent&#10; AgentUC--&amp;gt;&amp;gt;Service: agent&#10; Service-&amp;gt;&amp;gt;Service: Update agent.Status (Connected=true)&#10; &#10; Service-&amp;gt;&amp;gt;Service: report(agent, message, server)&#10; Note right of Service: Update agent from message:&amp;lt;br/&amp;gt;- AgentDescription&amp;lt;br/&amp;gt;- Health&amp;lt;br/&amp;gt;- RemoteConfigStatus&amp;lt;br/&amp;gt;- PackageStatuses&amp;lt;br/&amp;gt;- EffectiveConfig&#10; &#10; Service-&amp;gt;&amp;gt;AgentUC: SaveAgent(ctx, agent)&#10; AgentUC-&amp;gt;&amp;gt;DB: Save&#10; &#10; Service-&amp;gt;&amp;gt;Service: fetchServerToAgent(ctx, agent)&#10; Note right of Service: Build response:&amp;lt;br/&amp;gt;- RemoteConfig&amp;lt;br/&amp;gt;- ConnectionSettings&amp;lt;br/&amp;gt;- PackagesAvailable&amp;lt;br/&amp;gt;- Flags&amp;lt;br/&amp;gt;- Command&#10; &#10; Service--&amp;gt;&amp;gt;OpAMPLib: ServerToAgent Response&#10; OpAMPLib--&amp;gt;&amp;gt;Agent: ServerToAgent Message&#10; Note left of Agent: - InstanceUID&amp;lt;br/&amp;gt;- RemoteConfig&amp;lt;br/&amp;gt;- ConnectionSettings&amp;lt;br/&amp;gt;- PackagesAvailable&amp;lt;br/&amp;gt;- Flags&amp;lt;br/&amp;gt;- Command&#10; end&#10; &#10; Note over Agent,DB: Error Handling (if occurs)&#10; &#10; opt Read Error&#10; OpAMPLib-&amp;gt;&amp;gt;Service: OnReadMessageError(conn, type, msg, err)&#10; Note right of Service: Log error details&#10; end&#10; &#10; opt Response Error&#10; OpAMPLib-&amp;gt;&amp;gt;Service: OnMessageResponseError(conn, msg, err)&#10; Note right of Service: Log error details&#10; end&#10; &#10; Note over Agent,DB: Disconnection Phase&#10; &#10; Agent-&amp;gt;&amp;gt;OpAMPLib: Disconnect&#10; OpAMPLib-&amp;gt;&amp;gt;Service: OnConnectionClose(connection)&#10; Service-&amp;gt;&amp;gt;Service: Queue background cleanup&#10; Note right of Service: Return immediately&#10; &#10; Service-&amp;gt;&amp;gt;Service: Background Loop executes&#10; Service-&amp;gt;&amp;gt;ConnUC: GetConnectionByID(ctx, conn)&#10; ConnUC-&amp;gt;&amp;gt;DB: Find&#10; DB--&amp;gt;&amp;gt;ConnUC: connection&#10; ConnUC--&amp;gt;&amp;gt;Service: connection&#10; &#10; alt Not Anonymous&#10; Service-&amp;gt;&amp;gt;AgentUC: GetAgent(ctx, instanceUID)&#10; AgentUC-&amp;gt;&amp;gt;DB: Find&#10; DB--&amp;gt;&amp;gt;AgentUC: agent&#10; AgentUC--&amp;gt;&amp;gt;Service: agent&#10; Service-&amp;gt;&amp;gt;Service: Update agent.Status (Connected=false)&#10; Service-&amp;gt;&amp;gt;AgentUC: SaveAgent(ctx, agent)&#10; AgentUC-&amp;gt;&amp;gt;DB: Save&#10; end&#10; Service-&amp;gt;&amp;gt;ConnUC: DeleteConnection(ctx, connection)&#10; ConnUC-&amp;gt;&amp;gt;DB: Delete&#10; Note right of WS: WebSocket registry&amp;lt;br/&amp;gt;auto-cleanup&lt;/pre&gt;&#10;&lt;h2 id="opamp-callbacks-summary"&gt;OpAMP Callbacks Summary&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Callback&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;When Called&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Purpose&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;OnConnecting&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Before accepting connection&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Validate and decide whether to accept&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;OnConnected&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;After connection established&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Initialize connection tracking&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;OnMessage&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;When message received from agent&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Process agent data and send response&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;OnReadMessageError&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;When failed to read message&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Log and handle read errors&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;OnMessageResponseError&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;When failed to send response&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Log and handle send errors&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;OnConnectionClose&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;When connection closed&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Cleanup resources asynchronously&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="architecture-layers"&gt;Architecture Layers&lt;/h2&gt;&#10;&lt;p&gt;The diagram follows Hexagonal Architecture (Ports and Adapters):&lt;/p&gt;</description></item></channel></rss>