FleetAMP Architecture
FleetAMP is designed as a general-purpose, self-hosted fleet-management control plane for telemetry agents.
The project intentionally separates the FleetAMP domain from protocol-, storage-, SCM-, CMDB-, runtime-, and UI-specific implementations so upstream changes can be absorbed at adapter boundaries.
Layered architecture
Core design rule
Only the OpAMP integration layer should depend directly on opamp-go protocol types. The rest of FleetAMP should use the generic agents.ManagedAgent model and normalized management events.
This allows opamp-go to evolve without forcing changes across FleetAMP's grouping, configuration, RBAC, UI, enrichment, storage, or runtime model.
Managed agent types
The domain model is intentionally broader than OpenTelemetry Collector:
otel_collector— first supported implementationgrafana_alloy— reserved for a future Alloy-specific management adapter after its supported management semantics are implemented and tested- additional telemetry agents can be added later without changing the core model
Support for an agent type must not be inferred merely because it uses OpenTelemetry components. Each management adapter must explicitly implement the configuration, health, identity, and lifecycle semantics supported by that agent.
Runtime model
Agent type and runtime are separate concerns. The same telemetry agent may run on:
- VM/cloud instance
- bare metal
- standalone container runtime
- Kubernetes
ManagedAgent.Deployment uses the generic DeploymentContext model so FleetAMP does not become coupled to one cloud or orchestrator.
ManagedAgent
type: otel_collector | grafana_alloy | ...
deployment:
runtime: vm | bare_metal | container | kubernetes
provider: optional cloud/runtime provider
cluster: optional cluster name
namespace: optional namespace
node: optional node
FleetAMP manages telemetry-agent configuration and management state. It does not replace the runtime control plane:
- Kubernetes continues to own Pod scheduling, Deployments, DaemonSets, replicas, autoscaling, and workload lifecycle.
- Cloud/VM automation continues to own instance lifecycle.
- FleetAMP owns agent inventory, management policy, remote configuration, health, targeting, and deployment status.
See Deployment Model for details.
Attributes and labels
FleetAMP keeps reported metadata separate from management metadata:
- Attributes are reported by the agent/protocol, for example
host.name,os.type,service.version,cloud.region,k8s.cluster.name, ork8s.namespace.name. - Labels are owned by FleetAMP/operators and are used for grouping and targeting, for example
team=payments,environment=prod,role=agent, orruntime=kubernetes.
External enrichment providers can correlate CMDB/CSDM data and turn approved business context into FleetAMP labels without overwriting raw reported attributes.
Provider model
Configuration sources implement providers.ConfigProvider. This keeps FleetAMP independent of a particular Git vendor.
Examples:
- Azure DevOps
- GitHub
- GitLab
- local filesystem
Enrichment systems implement providers.EnrichmentProvider.
Examples:
- ServiceNow CSDM/CMDB
- generic REST CMDB
- organization-specific metadata services
Storage
FleetAMP application code should depend on storage interfaces rather than a database implementation.
Planned progression:
- in-memory store for development
- SQLite for simple self-hosted deployments
- PostgreSQL for HA and larger deployments
Initial implementation sequence
- generic managed-agent domain model
- runtime/deployment context model
- storage interfaces and in-memory implementation
- OpAMP adapter using
opamp-go - Collector inventory and health API
- remote configuration
- labels/selectors and groups
- SQLite persistence
- config-provider integrations
- enrichment-provider integrations
- RBAC/OIDC and rollout controls
- additional management adapters such as Grafana Alloy when their management semantics are explicitly supported
Compatibility philosophy
FleetAMP should prefer composition over forks. Upstream OpenTelemetry components such as opamp-go, the OpAMP Supervisor, and otelcol-contrib should remain upstream dependencies wherever possible. FleetAMP-specific features should live in independent layers and adapters.