Skip to main content
Version: Next

Observability Extension

A Helm chart to add Tracing functionality for the Agent Management Platform, by Deploying and Configuring the Agent Manager Observer.

helm install amp-observability-extension oci://ghcr.io/wso2/helm-charts/wso2-amp-observability-extension \
--namespace <namespace> --create-namespace \
--values my-values.yaml

amObserver​

ParameterDescriptionTypeDefault
amObserverAgent Manager Observer Service configobject
amObserver.enabledInstall the observer.booleantrue
amObserver.developmentModeRelax checks intended only for local development. Leave off in real deployments.booleanfalse
amObserver.nameName used for the observer's Kubernetes resources.string"amp-observer"
amObserver.replicaCountNumber of pod replicas to runinteger1
amObserver.imageContainer image for the observer.object
amObserver.image.repositoryContainer image repositorystring"ghcr.io/wso2/amp-observer"
amObserver.image.tagContainer image tag. Defaults to the chart's appVersion when emptystring"0.0.0-dev"
amObserver.image.pullPolicyImage pull policy (Always, IfNotPresent, or Never)string"IfNotPresent"
amObserver.portPort the observer serves its API on.integer9098
amObserver.resourceLimitsMaximum compute resources for the observer container.object
amObserver.resourceLimits.memoryMaximum memory before the container is OOM-killed.string"256Mi"
amObserver.resourceLimits.cpuMaximum CPU the container may use.string"500m"
amObserver.resourceRequestsCompute resources reserved for the observer at scheduling time.object
amObserver.resourceRequests.memoryMemory reserved at scheduling time.string"128Mi"
amObserver.resourceRequests.cpuCPU reserved at scheduling time.string"250m"
amObserver.serviceReachable externally via the observability-plane gateway (see ocIngress); set type to LoadBalancer to restore a dedicated external endpoint.object
amObserver.service.typeKubernetes Service type (ClusterIP, NodePort, or LoadBalancer)string"ClusterIP"
amObserver.ocIngressExposes the Agent Manager Observer through the observability-plane kgateway (gateway-default) so it does not need its own LoadBalancer service.object
amObserver.ocIngress.enabledExpose this component through the gatewaybooleantrue
amObserver.ocIngress.gatewayNameGateway that serves this routestring"gateway-default"
amObserver.ocIngress.hostnameHostname routed to this component through the gatewaystring"traces.amp.localhost"
amObserver.ocIngress.requestTimeoutTime the gateway waits for an observer response before giving up.string"60s"
amObserver.observerObserver Service connection — the upstream service that provides trace data.object
amObserver.observer.baseUrlIn-cluster base URL of the upstream observer.string"http://observer.openchoreo-observability-plane.svc.cluster.local:8080"
amObserver.observer.idpTokenUrlToken endpoint used to authenticate to the upstream observer.string"http://amp-thunder-extension-service.amp-thunder.svc.cluster.local:8090/oauth2/token"
amObserver.observer.idpClientIdDedicated outbound identity for calls to the OpenChoreo observer. Seeded by wso2-amp-thunder-extension (amObserverClient); authorized via the amp-observer-reader ClusterAuthzRoleBinding in wso2-amp-platform-resources-extension. No amp:* scopes. Generate this the same way as every other client secret in this product (e.g. AM_OBSERVER_CLIENT_SECRET="$(openssl rand -hex 32)") and pass it here AND to thunder.bootstrap.amObserverClient.clientSecret — they must match, since Thunder is what actually issued this client. Prefer existingSecret below over the inline value for production. NOTE: the Thunder bootstrap job is a pre-install-only hook — on an existing install, helm upgrade does NOT create this client; re-run the bootstrap job (or reinstall the thunder extension) before rolling out this value.string"am-observer-client"
amObserver.observer.idpClientSecretUnlike apiKey/encryptionKey elsewhere in this product, there is no safe empty-value fallback here: this must match whatever Thunder actually issued for amObserverClient, so it stays at the same default that chart ships (thunder.bootstrap.amObserverClient.clientSecret) rather than being emptied — override BOTH together via existingSecret in production.string"am-observer-client-secret"
amObserver.observer.existingSecretReference an existing secret for IDP credentials (recommended for production). When set, idpClientId/idpClientSecret above are ignored.string""
amObserver.observer.existingSecretClientIdKeyKey within the existing Secret holding the OAuth client ID.string"idpClientId"
amObserver.observer.existingSecretClientSecretKeyKey within the existing Secret holding the OAuth client secret.string"idpClientSecret"
amObserver.observer.defaultNamespaceNamespace assumed when a query does not name one.string"default"
amObserver.authJWT authentication — must match the agent-manager keyManager config so the same user token issued by Thunder is accepted by both services. Thunder stamps the resource-server identifier as the token audience, so query tokens (console/CLI) carry aud=urn:wso2:amp — the amp resource server's identifier, which must stay in sync with 60-amp-resource-server.yaml in the Thunder extension chart. The agent-manager-service's own amp-api-client client-credentials token (used for the monitor-run-logs server-to-server call) requests the full amp:* scope set and resolves to the same resource-server audience; "amp-api-client" is listed too as a defensive fallback for any client-credentials request that carries no scope (in which case Thunder falls back to the client ID as the audience). Publisher tokens (aud amp-publisher-*) are matched by a separate regex in the observer's auth middleware and do not need to be listed here. MCP tokens minted for the observer MCP client (am-obs-mcp) carry the RFC 8707 resource identifier — this service's publicUrl with "/mcp" appended (no trailing slash, per the MCP spec's canonical-URI guidance) — as their audience. That URL is NOT listed here: the chart appends publicUrl+"/mcp" to this list automatically, so overriding publicUrl alone keeps MCP tokens valid. "am-obs-mcp" is listed defensively; MCP logins normally carry that resource URL as the audience, not the client ID (unlike amp-api-client's client-credentials fallback, this can't occur for am-obs-mcp, a public client restricted to authorization_code).object
amObserver.auth.isLocalDevEnvAccept local-development tokens. Leave off in real deployments.booleanfalse
amObserver.auth.jwksUrlJSON Web Key Set used to verify incoming token signatures.string"http://amp-thunder-extension-service.amp-thunder.svc.cluster.local:8090/oauth2/jwks"
amObserver.auth.issuerMUST be the PUBLIC Thunder URL the platform issues tokens from (the iss claim), not the in-cluster service URL used for jwksUrl above. The console and amctl send the same user token here that they send to agent-manager-service, so this has to match that chart's agentManagerService.config.keyManager.issuer — otherwise every traces request 401s with "invalid issuer".string"http://thunder.amp.localhost:8080"
amObserver.auth.audienceAccepted token audiences, as a comma-separated list.string"urn:wso2:amp,amp-api-client,am-obs-mcp"
amObserver.publicUrlExternally reachable base URL of this service. Used as the resource identifier in RFC 9728 protected resource metadata and in the WWW-Authenticate resource_metadata parameter on 401 responses. Routed through the observability-plane gateway (see ocIngress above), which k3d maps to host port 11080 — not the 8080 control-plane gateway.string"http://traces.amp.localhost:11080"
amObserver.oauthOAuth 2.0 discovery metadata for MCP clients (RFC 9728). Consumed by the /mcp route's protected-resource well-known endpoint.object
amObserver.oauth.authorizationServersComma-separated list of OAuth 2.0 authorization server URLs advertised in RFC 9728 protected resource metadata. Left empty on purpose: it defaults to auth.issuer above, which is the same authorization server. Only set it when the advertised URL must differ from the token issuer. To suppress the metadata endpoint instead, empty publicUrl — the handler checks that first, and an empty auth.issuer fails startup validation.string""
amObserver.oauth.scopesSupportedComma-separated list of OAuth 2.0 scopes supported by this resource, advertised in RFC 9728 protected resource metadata.string"amp:observability:log-read,amp:observability:trace-read,amp:observability:metric-read,amp:observability:build-log-read"

networkPolicy​

ParameterDescriptionTypeDefault
networkPolicyNetwork restrictions applied to the pods this chart runs.object
networkPolicy.otelCollectorTraffic the collector is allowed to accept.object
networkPolicy.otelCollector.enabledNo-op on clusters whose CNI doesn't enforce NetworkPolicy.booleantrue

otelCollector​

ParameterDescriptionTypeDefault
otelCollectorOpenTelemetry collector extrasobject
otelCollector.otlpHttpPortCollector container ports. Must match the receiver/extension endpoints in deployments/values/oc-collector-configmap.yaml, which is applied separately (not templated by this chart) — update both if either changes.integer4318
otelCollector.healthCheckPortPort serving the collector's health check.integer13133
otelCollector.externalServiceOptional dedicated external Service for direct OTLP/HTTP pushes to the collector. Disabled by default: shipped clients send traces through the data-plane gateway's /otel route.object
otelCollector.externalService.enabledExpose the collector outside the cluster.booleanfalse
otelCollector.externalService.typeService type used for the external endpoint.string"LoadBalancer"
otelCollector.externalService.portPort the external endpoint listens on.integer21893