# Cloud Connectors Source: https://docs.odigos.io/central/adding-connections/cloud-connectors Discover and instrument cloud workloads from Odigos Central. Full documentation lives in the Cloud Connectors product tab. Cloud Connectors let Odigos Central discover and instrument workloads in cloud accounts (AWS, GCP, and more) from the same control plane you use for remote Kubernetes clusters and VM hosts. Each connector manages **one** cloud account boundary (for example an AWS account or a GCP project). From Central you discover workloads in that account, create Sources for the ones you want to observe, and track instrumentation progress. > **[Cloud Connectors documentation](/cloud-connectors/overview)** > > Enable the feature, add AWS or GCP connectors, instrument workloads, and manage connectors. # Connecting Remote Clusters Source: https://docs.odigos.io/central/adding-connections/remote-clusters Configure remote Kubernetes clusters to connect to Odigos Central using the CLI or Helm, including TLS configuration for production. Once Odigos Central is running, you need to configure your remote clusters to connect to it. This is done by installing Odigos in each remote cluster with the Central Proxy configuration. Set **`centralProxy.centralBackendURL`** (and **`clusterName`**). That URL is what the Central Proxy uses to open a WebSocket to Central at `/ws/proxy`. It must be reachable **from the remote cluster**, include a scheme (`https://` in production), and match the hostname you expose for `central-backend`. If UI and backend share one ingress host, use that host — and make sure `/ws/proxy` is routed to `central-backend`, not `central-ui`. See [Authentication](/central/authentication#production-ingress-configuration) and [Architecture](/central/architecture#backend-urls-helm-values). > [!NOTE] > > To connect VM hosts, see [VM Agent](/central/adding-connections/vmagent). > For cloud accounts (AWS, GCP, and more), see [Cloud Connectors](/cloud-connectors/overview). > [!NOTE] > > Remote clusters require the same Odigos Enterprise license token as the > central installation. ## Connect a remote cluster **CLI** ```bash theme={null} odigos install \ --onprem-token \ --set centralProxy.centralBackendURL= \ --set clusterName= ``` **Example:** ```bash theme={null} odigos install \ --onprem-token \ --set centralProxy.centralBackendURL=https://central-backend.example.com:8081 \ --set clusterName=production-east-1 ``` **Helm** Add the following to your remote cluster's `values.yaml`: ```yaml theme={null} clusterName: 'production-east-1' centralProxy: centralBackendURL: 'https://central-backend.example.com:8081' ``` Then install: ```bash theme={null} helm upgrade --install odigos odigos/odigos \ --namespace odigos-system \ --create-namespace \ -f values.yaml ``` ## TLS Configuration For production deployments, configure TLS for secure communication between the Central Proxy and Central Backend: ```yaml theme={null} centralProxy: centralBackendURL: 'https://central-backend.example.com:8081' tls: # Skip certificate verification (for testing/self-signed certificates only) skipVerify: false # Secret name containing CA certificate (key: 'ca.crt') caSecretName: 'central-ca-cert' # Secret name for mTLS client certificate (keys: 'tls.crt', 'tls.key') clientCertSecretName: 'central-client-cert' ``` **Create the CA certificate secret:** ```bash theme={null} kubectl create secret generic central-ca-cert \ --from-file=ca.crt=/path/to/ca.crt \ -n odigos-system ``` **Create the client certificate secret (for mTLS):** ```bash theme={null} kubectl create secret generic central-client-cert \ --from-file=tls.crt=/path/to/client.crt \ --from-file=tls.key=/path/to/client.key \ -n odigos-system ``` The proxy connects to **`/ws/proxy`** (not `/wss/proxy`). It uses the `wss` scheme when the backend URL host ends with `:443`. Verify the connection with: ```bash theme={null} kubectl logs deploy/central-proxy -n odigos-system --tail=20 ``` Look for `WebSocket connection established`. # Connecting VM Agent Source: https://docs.odigos.io/central/adding-connections/vmagent Connect existing VM Agent hosts to Odigos Central for centralized visibility and management. Powered by **eBPF**, the **Odigos VM Agent** automatically instruments systemd services, processes, and containers across your Linux hosts, seamlessly exporting telemetry to your observability backends. **Odigos Central** then brings it all together, providing a single, unified interface to view and manage all your VM Agent hosts from one place. > [!NOTE] > > If you are looking to connect Kubernetes clusters, see [Remote Clusters](/central/adding-connections/remote-clusters). > For cloud accounts (AWS, GCP, and more), see [Cloud Connectors](/cloud-connectors/overview). ## Prerequisites Before you connect a host, make sure you: * Install VM Agent on your Linux hosts. If VM Agent is not installed yet, start with [VM Agent installation](/vmagent/setup/installation). * Expose Odigos Central externally (for example, via an Ingress, LoadBalancer Service, or another supported exposure method). * Have a Central endpoint URL that is reachable from your VM hosts. To connect VM Agent to Odigos Central, use one of the following methods: **odictl** Use `odictl` to connect the VM Agent to Odigos Central. **1. Open odictl on the host** ```shell theme={null} odictl ``` ![odictl home screen](https://mintlify.s3.us-west-1.amazonaws.com/odigos/images/central/vmagent/odictl-home.png) **2. Go to the Configuration screen** Press `c` to navigate to the configuration screen. ![odictl config screen](https://mintlify.s3.us-west-1.amazonaws.com/odigos/images/central/vmagent/odictl-config.png) **3. Navigate to the Central section** Use the arrow keys or mouse to navigate to the Central section on the left side of the screen. ![odictl Central screen](https://mintlify.s3.us-west-1.amazonaws.com/odigos/images/central/vmagent/odictl-central.png) **4. Configure Central settings** Use the `Tab` key or mouse to navigate and configure the following fields: **central.enabled** `boolean` *required* Enable the Central controller. If false, the controller will not start.\\ Set this value to `true`. **central.endpoint** `string` *required* WebSocket endpoint of the Central server in host:port or URL format.\\ Set this to the Central endpoint URL from the [Prerequisites](#prerequisites) section above. **central.agent\_name** `string` Agent name identifier for this VM Agent instance. (Defaults to IP of the host where dots are replaced with dashes, with an ip- prefix)\\ Set this to the display name you want to see in Odigos Central. ![odictl Central screen](https://mintlify.s3.us-west-1.amazonaws.com/odigos/images/central/vmagent/odictl-central-configured.png) **5. Save the configuration** Press `Ctrl+S` to save the configuration. **6. Exit odictl** Press `Ctrl+C` to exit `odictl`. **7. Restart the odigos-vmagent service** Restart the VM Agent service: ```shell theme={null} sudo systemctl restart odigos-vmagent.service ``` **YAML** Use `YAML` configuration files to connect VM Agent to Odigos Central. **1. Navigate to the /var/lib/odigos-agent/config folder** ```shell theme={null} cd /var/lib/odigos-agent/config ``` **2. Edit the config.yaml file** Edit the `config.yaml` file using an editor of your choice. The example below uses [vi](https://en.wikipedia.org/wiki/Vi). ```shell theme={null} sudo vi config.yaml ``` **3. Add Odigos Central to the configuration** Modify the following fields: **central.enabled** `boolean` *required* Enable the Central controller. If false, the controller will not start.\\ Set this value to `true`. **central.endpoint** `string` *required* WebSocket endpoint of the Central server in host:port or URL format.\\ Set this to the Central endpoint URL from the [Prerequisites](#prerequisites) section above. **central.agent\_name** `string` Agent name identifier for this VM Agent instance. (Defaults to IP of the host where dots are replaced with dashes, with an ip- prefix)\\ Set this to the display name you want to see in Odigos Central. ```yaml theme={null} log_level: info log_format: console cli: port: 23678 central: enabled: true endpoint: "odigoscentral.example.com" agent_name: ip-10-0-1-51 platform_type: vm version: v1.6.0 ... ``` > [!NOTE] > > The `YAML` above is only a snippet of the full `config.yaml` file. **4. Save the file** ```shell theme={null} :wq! ``` **5. Restart the odigos-vmagent service** Restart the VM Agent service: ```shell theme={null} sudo systemctl restart odigos-vmagent.service ``` You should now see your VM Agent listed under Connections in the Central UI. ## Next steps > **[VM Agent overview](/vmagent/overview)** > > Learn more about VM Agent capabilities and core concepts. # Architecture Source: https://docs.odigos.io/central/architecture Learn about the architecture of Odigos Central, including the central cluster components, remote cluster proxies, VM agents, and optional Cloud Connectors. Odigos Central consists of components deployed in a **central (management) cluster**, plus connections to remote platforms: a lightweight proxy in each **remote Kubernetes cluster**, [VM Agent](/central/adding-connections/vmagent) hosts, and optional [Cloud Connectors](/cloud-connectors/overview) for cloud accounts. ```mermaid theme={null} flowchart TB subgraph central [Central Cluster] direction TB UI[Central UI
Port 3000] Backend[Central Backend
Port 8081] Redis[Redis
Port 6379] Keycloak[Keycloak
Port 8080] CC[Cloud Connectors] UI --> Backend Backend --> Redis Backend --> Keycloak end subgraph remotes [Remote Kubernetes Clusters] direction TB Proxy[Central Proxy] Odigos[Odigos Components] Proxy --> Odigos end subgraph vms [VM Hosts] VMA[VM Agent] end subgraph cloud [Cloud Accounts] CloudAcct[AWS / GCP / …] end Backend <-->|WebSocket| Proxy Backend <-->|WebSocket| VMA Backend <-->|WebSocket| CC CC -->|Cloud APIs| CloudAcct central ~~~ remotes remotes ~~~ vms vms ~~~ cloud ``` When [Cloud Connectors are enabled](/cloud-connectors/enable), the Central cluster also runs the connector-runtime controller, a dedicated PostgreSQL store for connector state, and per-account provider connector workloads (for example AWS, GCP, and other supported providers) that you create from the UI. ## Backend URLs (Helm values) Several Helm values are named `centralBackendURL`. They are **not interchangeable**. | Value | Chart | Who uses it | When to set | | - | - | - | - | | `centralProxy.centralBackendURL` | `odigos` (each **remote** cluster) | Central Proxy WebSocket to `/ws/proxy` | **Required** to connect a remote cluster. See [Connecting Remote Clusters](/central/adding-connections/remote-clusters). | | `centralUI.centralBackendURL` | `odigos-central` | Central UI → backend HTTP | Optional. Default is in-cluster `http://central-backend.:8081`. | | `auth.externalUrl` | `odigos-central` | Browser SSO redirects (Keycloak issuer / proxy URLs) | Set to the **browser-accessible** Central Backend URL (ingress hostname). See [Authentication](/central/authentication). | `centralProxy.centralBackendURL` is the URL **remote clusters** use to reach Central. `auth.externalUrl` is the URL **browsers** use for SSO. They are often the same public hostname when you terminate TLS on ingress, but they serve different clients. ## Components | Component | Description | | - | - | | **Central UI** | Web interface for managing connected clusters, VM agents, cloud connectors, sources, destinations, and sampling configurations | | **Central Backend** | API server that stores configuration in Redis and communicates with remote platforms | | **Central Proxy** | Lightweight service deployed in each remote cluster that bridges the central backend to local Odigos components | | **Cloud Connectors** (optional) | Provider runtimes in the Central cluster that discover and instrument cloud workloads for one cloud account boundary each (for example an AWS account or GCP project). See [Cloud Connectors](/cloud-connectors/overview). | # Authentication Source: https://docs.odigos.io/central/authentication Configure authentication for Odigos Central using OIDC or SAML identity providers, including production ingress setup. Odigos Central includes a bundled **Keycloak** instance as its identity provider. Keycloak is **not exposed externally** — the Central Backend acts as a reverse proxy, forwarding authentication requests (`/realms/*` and `/resources/*`) to Keycloak internally. This means you only need to expose the Central Backend and Central UI; no separate ingress or service is needed for Keycloak. Odigos Central supports two types of external SSO providers: * **OIDC** — for providers like Azure AD, Auth0, or any OpenID Connect-compatible IdP * **SAML** — for providers like Okta that use SAML 2.0 Both are configured through the Central UI — Odigos will create the required Keycloak configuration automatically. > [!NOTE] > > Helm `auth.adminUsername` and `auth.adminPassword` are the Keycloak master admin used by `central-backend`. They are not Central UI login credentials. Sign in with SSO (the first SSO user becomes an admin) or with users created in the UI. See [Troubleshooting](/central/troubleshooting#admin-credentials-vs-central-ui-login). ## Configuring the External URL For SSO redirects to work, Keycloak and the Central Backend must know the **browser-accessible URL** of the Central Backend. This is set via the `auth.externalUrl` Helm value. The Central UI URL used for OAuth `redirect_uri` (`/signin`) is configured separately via `auth.externalUIUrl` when it differs from the backend URL (e.g. local port-forward). | Environment | `auth.externalUrl` value | `auth.externalUIUrl` value | | - | - | - | | Local dev / port-forward | `http://localhost:8081` (default) | `http://localhost:3000` (auto) | | Ingress with HTTPS | `https://central.example.com` | same as `externalUrl` (auto) | | LoadBalancer service | `https://central-lb.prod.internal` | same as `externalUrl` (auto) | **CLI** ```bash theme={null} odigos pro central install \ --set onPremToken= \ --set auth.externalUrl=https://central.example.com ``` **Helm** ```yaml theme={null} auth: externalUrl: "https://central.example.com" ``` Or via `--set`: ```bash theme={null} helm upgrade --install odigos-central odigos/odigos-central \ --namespace odigos-central \ --create-namespace \ --set onPremToken= \ --set auth.externalUrl=https://central.example.com ``` > [!NOTE] > > When `auth.externalUrl` is empty (the default), it falls back to `http://localhost:8081`, which works for local development with `odigos pro central ui` port-forwarding. ## OIDC Provider Setup (Azure AD, Auth0, etc.) **1. Create the OIDC Identity Provider in the Central UI** Open the Central UI sign-in page, choose your OIDC provider (e.g., Azure AD), and fill in: * **Client ID** — from your IdP application * **Client Secret** — from your IdP application * **Discovery URL** — your IdP's OpenID Connect discovery endpoint * **Tenant ID** — required for Azure AD (Entra ID) > [!NOTE] > > Odigos Central will create/update the required configuration in the bundled Keycloak for you. Avoid configuring the identity provider directly in Keycloak unless you're troubleshooting. **2. Copy the Callback URL** After the provider is created successfully, the Central UI will display a **Callback URL**. Copy this URL and add it to your IdP application settings as the **Redirect URI** (or **Callback URL**). > [!WARNING] > > The Login button is disabled until you copy the Callback URL. This ensures you configure your IdP correctly before attempting to sign in. **3. Sign in via your OIDC provider** Click the **Login** button. You will be redirected to your IdP's sign-in page. After authenticating, you will be redirected back to Odigos Central and the first user account will be created as the admin. > [!NOTE] > > To grant roles automatically based on Azure AD group membership, see [Role Mappings](./role-mappings). ### Azure AD (Entra ID) network access Keycloak must reach Microsoft from inside the cluster. Allow egress to at least: * `login.microsoftonline.com` — authorization, token, JWKS, and OpenID discovery * `graph.microsoft.com` — OIDC userinfo Also allow any tenant-specific discovery or token URLs you configure. If domains are blocked, or the Entra app lacks permissions, Keycloak often shows only `couldNotSendAuthenticationRequestMessage` with no error class. See [Troubleshooting](/central/troubleshooting#azure-oauth). ## SAML Provider Setup (Okta, etc.) **1. Create the SAML Identity Provider in the Central UI** Open the Central UI sign-in page, choose SAML, and fill in the IdP details from your SAML provider: * **IdP Entity ID / Issuer** * **Single Sign-On Service URL** * **X.509 Signing Certificate** > [!NOTE] > > Odigos Central will create/update the required configuration in the bundled Keycloak for you. Avoid configuring the identity provider directly in Keycloak unless you're troubleshooting. **2. Copy the Callback URL (ACS URL)** After the provider is created, the Central UI will display the **Callback URL (ACS URL)**. Copy this URL and configure it in your SAML provider: * **Single sign-on URL** (ACS URL) * **Audience URI (SP Entity ID)** — use the same URL or the realm URL depending on your provider > [!WARNING] > > The Login button is disabled until you copy the Callback URL. Make sure to add it to your SAML application before proceeding. **3. Sign in via your SAML provider** Click the **Login with SAML** button. You will be redirected to your IdP's sign-in page. After authenticating, you will be redirected back to Odigos Central and the first user account will be created as the admin. ## Production Ingress Configuration When deploying behind an ingress, route traffic to the Central Backend and Central UI services only. Keycloak does **not** need its own ingress — the Central Backend handles `/realms/*` and `/resources/*` internally. `/resources/*` serves Keycloak theme and static assets (login page CSS, JS, and images). Browsers request it during sign-in; if it is routed to `central-ui`, login pages break. Example routing (single hostname, path-based): | Path | Service | Port | Notes | | - | - | - | - | | `/` | `central-ui` | 3000 | Central UI. Next.js also rewrites some API paths when the request hits this service. | | `/graphql` | `central-backend` | 8081 | GraphQL API | | `/api/*` | `central-backend` | 8081 | Sign-in / sign-out helpers | | `/realms/*` | `central-backend` | 8081 | Keycloak OIDC/SAML (proxied) | > [!WARNING] > > The WebSocket path is `/ws/proxy`, not `/wss/proxy`. `wss` is the TLS **scheme**. Central Proxy uses `wss` when the backend URL host ends with `:443`; otherwise it uses `ws`. Enable WebSocket upgrades (HTTP `Upgrade`) on this path. Set `auth.externalUrl` (and `auth.externalUIUrl` if the UI origin differs) to the public HTTPS URL of this hostname. Remote clusters should set `centralProxy.centralBackendURL` to the same reachable backend URL. See [Architecture](/central/architecture#backend-urls-helm-values) and [Connecting Remote Clusters](/central/adding-connections/remote-clusters). > [!NOTE] > > If you're looking to enable OIDC for the **non-central** Odigos UI (not Odigos > Central), see the dedicated OIDC documentation: [`OIDC (OpenID > Connect)`](../../enterprise/features/oidc). # Installation Source: https://docs.odigos.io/central/installation Install Odigos Central using the CLI or Helm chart to manage multi-cluster observability from a single control plane. You can install Odigos Central using the CLI or Helm chart. **CLI** Use the `odigos pro central install` command with `--set` flags: ```bash theme={null} odigos pro central install --set onPremToken= ``` This installs: * central-backend * central-ui * redis (for state) * keycloak (as identity provider) ### CLI Flags | Flag | Default | Description | | - | - | - | | `--set onPremToken` | (required) | Your Odigos Enterprise license token | | `--set auth.externalUrl` | `http://localhost:8081` | Browser-accessible URL of the Central Backend for SSO redirect flows | | `--set auth.externalUIUrl` | (derived from `auth.externalUrl`) | Browser-accessible URL of the Central UI for OAuth `redirect_uri` (`/signin`). When empty, defaults to `auth.externalUrl`, except for local port-forward (`http://localhost:8081`) where the UI is on port 3000 | | `--set auth.adminPassword` | (auto-generated) | Keycloak **master** admin password for backend API access. If not provided, a random password is generated. Not used for Central UI login. See [Troubleshooting](/central/troubleshooting#admin-credentials-vs-central-ui-login) | | `--set auth.adminUsername` | `admin` | Keycloak master admin username | | `--set auth.persistence.enabled` | `false` | Persist Keycloak data on a PVC. Recommended for production. See [Keycloak persistence](#keycloak-persistence) | | `--set cloudConnectors.enabled` | `false` | Enable [Cloud Connectors](/cloud-connectors/enable) (controller, Postgres, CRD) | | `--namespace`, `-n` | `odigos-central` | Target namespace for installation | | `--version` | (current) | Specify a specific version to install | **Example with all options:** ```bash theme={null} odigos pro central install \ --set onPremToken= \ --namespace odigos-central \ --version v1.0.0 ``` **Helm** Add the Odigos Helm repository and install: ```bash theme={null} helm repo add odigos https://odigos-io.github.io/odigos/ helm repo update helm upgrade --install odigos-central odigos/odigos-central \ --namespace odigos-central \ --create-namespace \ --set onPremToken= ``` For production deployments, consider using a `values.yaml` file: ```yaml theme={null} onPremToken: "" auth: externalUrl: "https://central.example.com" # Browser-accessible URL for SSO redirects adminUsername: admin adminPassword: "" persistence: enabled: true size: 2Gi storageClassName: "gp3" centralBackend: autoscaling: enabled: true minReplicas: 2 maxReplicas: 10 resources: requests: cpu: 200m memory: 256Mi limits: cpu: 1000m memory: 1Gi centralUI: resources: requests: cpu: 100m memory: 128Mi limits: cpu: 500m memory: 512Mi ``` Then install with: ```bash theme={null} helm upgrade --install odigos-central odigos/odigos-central \ --namespace odigos-central \ --create-namespace \ -f values.yaml ``` > [!TIP] > > `centralProxy.centralBackendURL` is not a Central install flag. Set it when you install the `odigos` chart on each **remote** cluster so the Central Proxy can reach this backend. See [Connecting Remote Clusters](/central/adding-connections/remote-clusters). ## Keycloak image Odigos Central deploys Keycloak from the image in `auth.image` (see the [`odigos-central` Helm values file](https://github.com/odigos-io/odigos/blob/main/helm/odigos-central/values.yaml)). That image is based on official Keycloak with health and metrics enabled at build time, which is required for `start --optimized`. The chart starts Keycloak with `start --optimized --http-enabled=true` and probes `/health/live` and `/health/ready`. Those endpoints are not available on a stock official image in optimized mode. > [!WARNING] > > Do not replace `auth.image` in the helm chart with `quay.io/keycloak/keycloak` (or another unmodified official tag) unless you also change the container args and probes. An official image can appear Ready while `central-backend` stays on "Waiting for Keycloak to become ready" and `/readyz` never succeeds. See [Troubleshooting](/central/troubleshooting#waiting-for-keycloak-to-become-ready). When mirroring images to a private registry, also pull the Keycloak image from `auth.image` in the Helm values file. See [Custom Docker Registry](#custom-docker-registry). ## Custom Docker Registry Odigos Central images are hosted at `registry.odigos.io`. To install from a private registry, mirror at least: | Image | Notes | | - | - | | `registry.odigos.io/odigos-enterprise-central-backend:$VERSION` | Central Backend. Tag matches the Odigos Central version. | | `registry.odigos.io/odigos-enterprise-central-ui:$VERSION` | Central UI. Tag matches the Odigos Central version. | | Keycloak (`auth.image`) | Bundled Keycloak. Tag is **not** the Odigos version. Do not substitute the official Keycloak image. | | Redis (`redis.image`) | Bundled Redis. | The Keycloak and Redis image versions are defined in the [`odigos-central` Helm values file](https://github.com/odigos-io/odigos/blob/main/helm/odigos-central/values.yaml) (`auth.image` and `redis.image`). Use those values as the source of truth when mirroring; do not rely on tags copied from this page. If Cloud Connectors are enabled, also mirror `odigos-enterprise-connector-runtime`, `odigos-enterprise-connector-aws`, `odigos-enterprise-connector-gcp`, `odigos-enterprise-connector-azure`, and `odigos-enterprise-connector-postgres`. Keycloak is set with `auth.image`, not `imagePrefix`. After you push the mirrored Keycloak image, set `auth.image` to that full URL. Copy `auth.image` from the Helm values file first: ```bash theme={null} # Example: registry.odigos.io/keycloak: from helm/odigos-central/values.yaml export KEYCLOAK_IMAGE= export KEYCLOAK_TAG= docker pull --platform $PLATFORM $KEYCLOAK_IMAGE docker tag $KEYCLOAK_IMAGE $CUSTOM_DOCKER_REGISTRY/keycloak:$KEYCLOAK_TAG docker push $CUSTOM_DOCKER_REGISTRY/keycloak:$KEYCLOAK_TAG ``` ```bash theme={null} helm upgrade --install odigos-central odigos/odigos-central \ --namespace odigos-central \ --create-namespace \ --set onPremToken=$ODIGOS_TOKEN \ --set imagePrefix=$CUSTOM_DOCKER_REGISTRY \ --set image.tag=$VERSION \ --set auth.image=$CUSTOM_DOCKER_REGISTRY/keycloak:$KEYCLOAK_TAG ``` For mirroring **K8s agent** images (`odigos` chart), see [Custom Docker Registry](/enterprise/setup/docker-registry). ## Keycloak persistence Persistence is **disabled by default**. Without a PVC, Keycloak stores data in the container filesystem. Restarting or recreating the Keycloak pod wipes SSO configuration and users stored in Keycloak. For production, enable a PVC: ```yaml theme={null} auth: persistence: enabled: true size: 2Gi storageClassName: "gp3" # omit to use the cluster default ``` After resetting Keycloak, restart `central-backend` if login does not recover. With persistence enabled, a bad identity-provider config in the database can leave pods Ready while OAuth still fails until the PVC is recreated. See [Troubleshooting](/central/troubleshooting#keycloak-persistence-and-resets). > [!NOTE] > > `auth.adminUsername` / `auth.adminPassword` are the Keycloak master admin used by `central-backend`, not Central UI login credentials. On upgrade, Helm reuses the existing `keycloak-admin-credentials` secret and ignores a new `auth.adminPassword` value. ## Optional: Cloud Connectors Cloud Connectors are disabled by default. To discover and instrument cloud workloads (AWS, GCP, and more) from Central, enable the feature at install or upgrade time: **CLI** ```bash theme={null} odigos pro central install \ --set onPremToken= \ --set cloudConnectors.enabled=true \ --set cloudConnectors.postgres.password= \ --set cloudConnectors.postgres.persistence.enabled=true \ --set cloudConnectors.postgres.persistence.size=20Gi \ --set cloudConnectors.postgres.persistence.storageClassName= ``` On an existing install: ```bash theme={null} odigos pro central upgrade \ --set cloudConnectors.enabled=true \ --set cloudConnectors.postgres.password= \ --set cloudConnectors.postgres.persistence.enabled=true \ --set cloudConnectors.postgres.persistence.size=20Gi \ --set cloudConnectors.postgres.persistence.storageClassName= ``` **Helm** ```bash theme={null} helm upgrade --install odigos-central odigos/odigos-central \ --namespace odigos-central \ --reuse-values \ --set cloudConnectors.enabled=true \ --set cloudConnectors.postgres.password= \ --set cloudConnectors.postgres.persistence.enabled=true \ --set cloudConnectors.postgres.persistence.size=20Gi \ --set cloudConnectors.postgres.persistence.storageClassName= ``` See [Enable Cloud Connectors](/cloud-connectors/enable) for PostgreSQL settings, verification steps, and full values. # Overview Source: https://docs.odigos.io/central/overview Odigos Central is the centralized deployment mode of Odigos, allowing organizations to manage observability from a single UI across Kubernetes clusters, VM hosts, and cloud connectors. > [!NOTE] > > This feature is available in Odigos Enterprise tier only. Please contact the > Odigos team to inquire about access to the Enterprise version. Odigos Central is a centralized management layer for multi-environment observability. Instead of configuring instrumentation, [sampling rules](/enterprise/pipeline/sampling/rules/overview), and destinations separately in each place, Odigos Central provides a **single pane of glass** to manage: * [Remote Kubernetes clusters](/central/adding-connections/remote-clusters) * [VM Agent](/central/adding-connections/vmagent) hosts * [Cloud Connectors](/cloud-connectors/overview) for cloud accounts (AWS, GCP, and more) ## Why Use Odigos Central? * **Unified Management** - Configure instrumentation, sampling rules, and observability pipelines across clusters, VMs, and cloud accounts from a single UI * **Reduced Operational Overhead** - No need to SSH or `kubectl` into each environment separately * **Centralized Access Control** - Manage user authentication and authorization with support for SSO providers like Okta * **Consistent Configuration** - Apply the same sampling and instrumentation rules uniformly across environments * **Audit and Compliance** - Single point of control for observability configuration changes After [installation](/central/installation), use [port-forward](/central/ui) for local access, or expose Central with ingress for production ([Authentication](/central/authentication#production-ingress-configuration)). # Prerequisites Source: https://docs.odigos.io/central/prerequisites Requirements for installing Odigos Central, including Kubernetes version, license token, and network connectivity. Before installing Odigos Central, ensure you have: * **Kubernetes** version 1.19.0 or higher * **Odigos Enterprise license token** (contact Odigos team to obtain) * **Helm** 3.x (if using Helm installation method) * **Network connectivity** from remote clusters to the Central Backend endpoint ## Network Requirements In production, users typically reach a **single hostname** (ingress) that path-routes to Central UI and Central Backend. See [Authentication](/central/authentication#production-ingress-configuration) for the full path table. Ensure the following network connectivity: | Source | Destination | Port / path | Protocol | | - | - | - | - | | Users (browser) | Ingress hostname → Central UI | 443 (UI on 3000 behind ingress) | HTTPS | | Users (browser) | Ingress hostname → Central Backend | 443: `/graphql`, `/api/*`, `/realms/*` | HTTPS | | Central UI | Central Backend | 8081 | HTTP (in-cluster) | | Central Backend | Redis | 6379 | TCP | | Central Backend | Keycloak | 8080 | HTTP (in-cluster) | | Keycloak | Identity provider (e.g. Azure) | 443 | HTTPS (`login.microsoftonline.com`, `graph.microsoft.com` for Entra ID) | | Remote cluster proxies, VM agents, cloud connectors | Central Backend | 443: `/ws/proxy` | WebSocket (`wss` when the URL host ends with `:443`) | > [!WARNING] > > Odigos Central is an Enterprise feature and requires a valid license token. > Make sure your `--onprem-token` is valid and has the necessary permissions. # Role Mappings Source: https://docs.odigos.io/central/role-mappings Automatically assign Odigos Central roles to users based on their Azure AD (Entra ID) group membership. Role mappings let you grant Odigos Central roles automatically based on the **groups** a user belongs to in Azure AD (Entra ID). For example, members of your `odigos-admins` group can be granted the **Admin** role on sign-in, with no per-user configuration. Roles are evaluated on **every login**, so changes to a user's group membership (or to the mappings themselves) take effect the next time they sign in. > [!NOTE] > > Role mappings require Azure AD configured as an OIDC SSO provider. See > [Authentication](./authentication) to set that up first. ## Roles | Role | Capabilities | | - | - | | **Admin** | Full access, including managing users and role mappings | | **Maintainer** | Manage sources, destinations, and configuration | | **Viewer** | Read-only access | When a user belongs to multiple mapped groups, the **highest** role wins. Precedence is: **Owner > Admin > Maintainer > Viewer**. ## Configuring Azure AD group claims For role mappings to work, Azure must include the user's groups in the token it sends to Odigos. **1. Emit the groups claim** In the Azure portal, open your App Registration → **Token configuration** → **Add groups claim**. Choose the groups to emit (e.g. *Security groups*) for both the **ID** and **Access** tokens. ![Azure App Registration Token configuration with the Edit groups claim panel, Security groups selected for ID and Access tokens](https://mintcdn.com/odigos/9rV-UTkDfyqYKqN-/images/central/azure-groups-claim.png?fit=max\&auto=format\&n=9rV-UTkDfyqYKqN-\&q=85\&s=08c57a9e8d06264ec3640e7065bd7760) **2. Note the group identifier** The value you map must exactly match what Azure puts in the `groups` claim. By **default** Azure emits the group **Object ID** (a GUID) — copy it from Azure AD → **Groups**. If you've configured the groups claim to emit names instead (e.g. *Cloud-only group display names*, or `sAMAccountName` for on-prem-synced groups), use the group **name** instead. Either way, paste that exact value into the **Group** field. > [!NOTE] > > Azure uses `groups` as the claim name by default, which matches the Odigos > default. If you've customized the claim name, set it in the **Claim Name** > field when creating a mapping. ## Creating a role mapping **1. Open Access Management** In the Central UI, go to **Access Management** and select the **Role Mappings** tab. **2. Add a mapping** Click **Create Role Mapping** and fill in: * **Group** — the value from the previous step: the group **Object ID** (GUID) by default, or the group **name** if Azure emits names. It must exactly match what Azure puts in the claim. * **Role** — the Odigos role to grant: **Admin**, **Maintainer**, or **Viewer**. * **Claim Name** — the token claim that carries group membership. Defaults to `groups`. * **Display Name** *(optional)* — a friendly label shown in the table instead of the raw group value. This does **not** affect matching. ![Create Role Mapping dialog in the Central UI with Group, Role, Claim Name, and Display Name fields](https://mintcdn.com/odigos/9rV-UTkDfyqYKqN-/images/central/create-role-mapping.png?fit=max\&auto=format\&n=9rV-UTkDfyqYKqN-\&q=85\&s=d4a5d7defa08f8e73c154b8948c0e0c9) **3. Save and sign in** Save the mapping. Affected users receive their role the next time they sign in. > [!NOTE] > > Only **Admins** can create, edit, or delete role mappings. Viewers can see the > mappings in read-only mode. ## How it works Odigos manages the group-to-role assignment in the bundled Keycloak for you — you don't need to configure Keycloak directly. On each login, Keycloak re-evaluates the user's group claim against your mappings and assigns the matching role (highest privilege wins). Removing a mapping strips the corresponding role on the user's next sign-in. # Troubleshooting Source: https://docs.odigos.io/central/troubleshooting Diagnose Odigos Central startup, Keycloak, SSO, and remote-cluster connection issues. Use this page when Central installs, but pods stay NotReady, SSO fails, or remote clusters cannot connect. For production URL and ingress routing, see [Authentication](/central/authentication). For remote cluster Helm values, see [Connecting Remote Clusters](/central/adding-connections/remote-clusters). ## Waiting for Keycloak to become ready `central-backend` logs `Waiting for Keycloak to become ready` while it is still initializing. During that time: * **Liveness** (`/healthz`) returns 200 as soon as the process binds port 8081, so Kubernetes does not restart the pod. * **Readiness** (`/readyz`) stays 503 until Keycloak and Redis init finish. Treat `/readyz` as the signal that Central is usable, not `/healthz`. The backend waits until both succeed: 1. `GET http://keycloak:8080/realms/master/.well-known/openid-configuration` 2. A password grant against the Keycloak **master** admin (`admin-cli`) using the credentials in the `keycloak-admin-credentials` secret Keycloak itself is only Ready when `/health/live` and `/health/ready` succeed. Those endpoints exist because Odigos ships a **custom Keycloak image** with health checks enabled at **build time**. Use `auth.image` from the [`odigos-central` Helm values file](https://github.com/odigos-io/odigos/blob/main/helm/odigos-central/values.yaml) as the source of truth. Replacing it with the official Keycloak image while keeping `start --optimized` and the chart probes typically leaves `central-backend` stuck in this wait. See [Installation](/central/installation#keycloak-image). ```bash theme={null} kubectl logs deploy/central-backend -n odigos-central --tail=50 kubectl logs deploy/keycloak -n odigos-central --tail=50 kubectl get pods -n odigos-central ``` ## Keycloak persistence and resets Keycloak persistence is **disabled by default** (`auth.persistence.enabled: false`). Without a PVC, restarting or recreating the Keycloak pod wipes realm data, identity-provider config, and users stored in Keycloak. After you reset Keycloak **without** persistence: 1. Confirm Keycloak becomes Ready. 2. Restart `central-backend` so it can recreate Keycloak clients, roles, and broker configuration: ```bash theme={null} kubectl rollout restart deployment/central-backend -n odigos-central ``` The backend watches Keycloak health and can re-apply some state automatically, but if login still fails after a Keycloak reset, restart `central-backend`. When persistence is enabled, a bad identity-provider configuration written into the Keycloak database can leave **all pods Ready** while OAuth still fails. Logs may not mention the PVC. Recover by deleting the Keycloak PVC (after backing up if needed), recreating Keycloak, and restarting `central-backend`. Helm `auth.adminPassword` is used only on **first install** when the `keycloak-admin-credentials` secret does not exist. On upgrade, the chart **reuses the existing secret** and ignores the value in Helm. Read the live password with: ```bash theme={null} kubectl get secret keycloak-admin-credentials -n odigos-central \ -o jsonpath='{.data.admin-password}' | base64 -d; echo ``` If you recreate the secret without wiping Keycloak data, the password in the secret and the password Keycloak stored will not match, and the backend cannot obtain an admin token. ## Admin credentials vs Central UI login `auth.adminUsername` and `auth.adminPassword` configure the **Keycloak master admin**. `central-backend` uses that account to manage Keycloak. They are **not** Central UI users. Sign in to the Central UI with: * An SSO provider configured in the UI (the first successful SSO user becomes an admin), or * A user created later in Central Access Management Using the Helm admin username and password on the Central UI sign-in form returns **invalid credentials**. ## Azure OAuth Keycloak (inside the cluster) must reach Microsoft Entra ID. Allow egress at least to: * `login.microsoftonline.com` (authorization, token, JWKS, discovery) * `graph.microsoft.com` (OIDC userinfo) Also allow the exact discovery, token, and authorization URLs configured for your tenant. Azure Tenant ID is required for the Azure OIDC provider. See [Authentication](/central/authentication) and [Role Mappings](/central/role-mappings). Keycloak often shows only `couldNotSendAuthenticationRequestMessage` for network, DNS, TLS, and permission failures. That string does not distinguish a blocked domain from insufficient Entra app permissions. Check Keycloak logs and your egress policy. ## Remote cluster cannot connect (WebSocket) Remote proxies, VM agents, and cloud connectors connect to `central-backend` at **`/ws/proxy`** (not `/wss/proxy`). `wss` is the TLS scheme when the backend URL host ends with `:443`. If your ingress sends `/` to `central-ui`, you must add an explicit `/ws/proxy` rule to `central-backend` and enable WebSocket upgrades. See [Authentication](/central/authentication#production-ingress-configuration). # Accessing the Central UI Source: https://docs.odigos.io/central/ui Access the Odigos Central web interface using port-forwarding or a custom address. After installation, access the Central UI using port-forward: ```bash theme={null} odigos pro central ui ``` This forwards: * **Central UI** to `http://localhost:3000` * **Central Backend** to `http://localhost:8081` ## Options | Flag | Default | Description | | - | - | - | | `--address` | `localhost` | Address to bind the port-forward to | | `--namespace`, `-n` | `odigos-central` | Namespace where Odigos Central is installed | **Example:** To access from other machines on your network: ```bash theme={null} odigos pro central ui --address 0.0.0.0 ``` For production, expose Central with an ingress instead of port-forward. Route UI and backend paths as described in [Authentication](/central/authentication#production-ingress-configuration), and set `auth.externalUrl` to the public HTTPS URL. # Uninstall Source: https://docs.odigos.io/central/uninstall Remove Odigos Central from your cluster using the CLI or Helm. To completely remove Odigos Central: ## Using CLI ```bash theme={null} odigos pro central uninstall ``` **Options:** | Flag | Default | Description | | - | - | - | | `--namespace`, `-n` | `odigos-central` | Target namespace | | `--yes` | `false` | Skip confirmation prompt | **Example:** ```bash theme={null} odigos pro central uninstall --namespace odigos-central --yes ``` ## Using Helm ```bash theme={null} helm uninstall odigos-central --namespace odigos-central kubectl delete namespace odigos-central ``` > [!WARNING] > > Uninstalling Odigos Central will disconnect all remote clusters. Make sure to > plan for this accordingly. # Upgrade Source: https://docs.odigos.io/central/upgrade Upgrade Odigos Central to a newer version using the CLI or Helm. To upgrade Odigos Central to a newer version: ## Using CLI ```bash theme={null} odigos pro central upgrade --version ``` **Options:** | Flag | Default | Description | | - | - | - | | `--version` | (required) | Version to upgrade to (e.g., `v1.2.0`) | | `--namespace`, `-n` | `odigos-central` | Target namespace | | `--yes` | `false` | Skip confirmation prompt | | `--image-pull-secrets` | (existing) | Update image pull secrets | | `--central-max-message-size` | (existing) | Update max gRPC message size | **Example:** ```bash theme={null} odigos pro central upgrade --version v1.2.0 --yes ``` ## Using Helm ```bash theme={null} helm repo update helm upgrade odigos-central odigos/odigos-central \ --namespace odigos-central \ --reuse-values \ --version ``` > [!NOTE] > > When upgrading, the Keycloak admin password is preserved from the existing > secret to prevent credential mismatch. # Add an AWS Connector Source: https://docs.odigos.io/cloud-connectors/add-connectors/add-aws-connector Connect an AWS account to Odigos Central, configure authentication and capabilities, and verify discovery. Add an AWS Cloud Connector to manage AWS accounts. The connector runs in the Central cluster, discovers resources across every region enabled in that account, and can instrument AWS Lambda functions when you create Sources. > [!NOTE] > > [Enable Cloud Connectors](/cloud-connectors/enable) > before you add a connector. ## Resource types | Type | Domain | Discovery | Instrumentation | | - | - | - | - | | `aws.lambda` | Workload | Yes | Yes (OpenTelemetry Lambda layer) | | `aws.fargate-task` | Workload | Yes | Yes (agent-staging sidecar in the task definition) | | `aws.ecs-cluster` | Compute platform | Yes | Coming soon | | `aws.fargate-cluster` | Compute platform | Yes | Coming soon | > [!NOTE] > > `aws.ecs-cluster` and `aws.fargate-cluster` are discovered for coverage today; > Odigos does not yet install a separate agent onto them. `aws.fargate-task` — an > individual Fargate **service** — is the ECS resource Odigos instruments directly. aws.lambda and aws.fargate-task support two instrumentation approaches: * Odigos-managed: The connector automatically applies and maintains the required changes. * Self-managed: You maintain full control by provisioning through your own CloudFormation, CDK, or Terraform pipelines. (For a deeper comparison, see [Odigos-managed vs. self-managed instrumentation](/cloud-connectors/overview#odigos-managed-vs-self-managed-instrumentation).) For the self-managed path, artifact preloading, and per-language CDK/CloudFormation snippets, see the [AWS Connector](/cloud-connectors/aws/overview) section. ## Add the connector **1. Open Add connector and choose AWS** In the Central UI, open Connections / Connectors and start **Add connector**. Choose **AWS**. **2. Choose access level** Choose how much access this connector should have. The UI shows an **example IAM permissions policy** for the level you pick. You will attach that policy when you create the IAM role or user in the next step. ![Create Cloud Connector dialog with AWS selected and the Discovery + instrumentation access level showing an IAM policy preview](https://mintcdn.com/odigos/cif9LffayXl8I7ih/images/cloud-connectors/aws-access-level.png?fit=max\&auto=format\&n=cif9LffayXl8I7ih\&q=85\&s=bc0d72296568b3ad94f87bd343d0f87b) **Discovery only** The connector can list and discover resources (e.g. Lambda functions and ECS/Fargate resources) but cannot change them or attach instrumentation. Use this when you want inventory and visibility first, or if you are managing the environment with Infrastructure as code (IaC). Typical policy actions include: | Purpose | Actions | | - | - | | Authentication | `sts:GetCallerIdentity` | | Region enumeration | `ec2:DescribeRegions` | | Lambda discovery | `lambda:ListFunctions`, `lambda:ListTags` | | ECS / Fargate discovery | `ecs:ListClusters`, `ecs:DescribeClusters`, `ecs:ListServices`, `ecs:DescribeServices`, `ecs:ListTasks`, `ecs:DescribeTasks`, `ecs:DescribeTaskDefinition` | > [!NOTE] > > `ecs:DescribeTaskDefinition` is a discovery permission, not only an > instrumentation one — it's what lets Odigos see whether a self-managed > Fargate service already carries your own instrumentation, so grant it > even if you only ever plan to self-manage instrumentation. **Discovery + instrumentation** The connector can discover resources and instrument supported workloads. Prefer this for a full setup in one step. Includes all discovery actions, plus Odigos-managed instrumentation for Lambda and Fargate: | Purpose | Actions | | - | - | | Read and update function config | `lambda:GetFunctionConfiguration`, `lambda:UpdateFunctionConfiguration` | | Manage OTel layers | `lambda:GetLayerVersion`, `lambda:ListLayers`, `lambda:PublishLayerVersion`, `lambda:DeleteLayerVersion` | | Manage Fargate task definitions | `ecs:RegisterTaskDefinition`, `ecs:UpdateService` | | Pass task/execution roles when registering a task definition | `iam:PassRole` (scope with condition `iam:PassedToService=ecs-tasks.amazonaws.com`) | Odigos-managed instrumentation also requires an [OTLP destination](/cloud-connectors/instrument-workloads#add-an-otlp-destination) after the connector is online. **Custom** Pick which resource types may be discovered and which may be instrumented. The UI updates the **policy preview** to match your selections so the IAM policy stays aligned with what verification will validate. Use Custom when you need a narrower or broader mix than the presets (e.g. discover ECS clusters but only instrument Lambda). > [!NOTE] > > Use the policy preview as the source of truth for the permissions policy. > This keeps connector access scoped — not blanket account admin. See > [You control the access scope](/cloud-connectors/overview#you-control-the-access-scope). Click **Next** to continue to **Setup credentials**. **3. Setup credentials** On the **Setup credentials** screen, apply the IAM policy from the previous step in your AWS account and enter the credentials Odigos will use. ![Setup credentials screen for an AWS connector with the authentication method set to Assume Role and CloudFormation selected as the setup method](https://mintcdn.com/odigos/cif9LffayXl8I7ih/images/cloud-connectors/aws-setup-credentials.png?fit=max\&auto=format\&n=cif9LffayXl8I7ih\&q=85\&s=43b278c4028d105ceb887a417bc7a6a0) #### 1. Choose authentication method **Assume Role** Odigos assumes a scoped IAM role. Prefer this for production: you attach the permissions policy to the role, and Odigos does not rely on long-lived admin credentials in the connector. You still provide base access keys that are allowed to call `sts:AssumeRole` on that role (plus the Role ARN and External ID). #### 2. Choose setup method Use the tool that best fits your workflow — **CloudFormation**, **Terraform**, **AWS CLI**, or **Manual**. Each path ends with the same role (trust policy + access-level permissions) and a Role ARN to paste back into Odigos. #### 3. Create IAM role Follow the instructions the UI shows for the method you picked, then copy the **Role ARN**. **CloudFormation** 1. Open the CloudFormation instructions in the UI. 2. Deploy the provided template (or stack) in the target AWS account. 3. Confirm the stack created the IAM role with the UI trust policy and the permissions policy from the access level step. 4. Copy the **Role ARN** from the stack outputs or the IAM console. **Terraform** 1. Open the Terraform snippet in the UI. 2. Apply it in the target account or module. 3. Confirm the role was created with the UI trust policy and the permissions policy from the access level step. 4. Copy the **Role ARN** from the Terraform output or the IAM console. **AWS CLI** 1. Open the AWS CLI commands in the UI. 2. Run them against the target account (creates the role, trust policy, and attaches permissions). 3. Confirm the commands completed successfully. 4. Copy the **Role ARN** from the command output or the IAM console. **Manual** 1. Open the AWS Console → IAM → Roles → Create role. 2. Select **Custom trust policy**. 3. Paste the trust policy from the UI (includes the External ID condition when present). 4. Attach the **permissions policy from the access level step**. 5. Name the role and create it. 6. Open the role summary and copy the **Role ARN**. ![Create IAM role step showing CloudFormation instructions and the Enter Role ARN form with account ID, access keys, Role ARN, and External ID fields](https://mintcdn.com/odigos/cif9LffayXl8I7ih/images/cloud-connectors/aws-create-iam-role.png?fit=max\&auto=format\&n=cif9LffayXl8I7ih\&q=85\&s=7e4821c52bd4387ce42f761133d4d80b) #### 4. Enter Role ARN Paste the values from the previous step into the form — account ID, base access keys, the Role ARN you copied, and the External ID from the UI trust policy. **AWS Account ID** `string` *required* The 12-digit account ID where the IAM role lives. **Access Key ID** `string` *required* Access key for an identity that can assume the role. **Secret Access Key** `string` *required* Secret access key for that identity. **Session Token** `string` Required only for temporary access keys. **IAM Role ARN** `string` *required* ARN of the cross-account role Odigos assumes. **External ID** `string` Must match the External ID in the role trust policy (shown in the UI, e.g. `odigos-connector`). **Static keys** Use IAM user access keys that already have the permissions policy from the access level step attached. There is no separate role setup flow in the UI for this method. 1. In AWS, create or select an IAM user. 2. Attach the **permissions policy from the access level step**. 3. Create an access key for that user. 4. Enter the credentials in Odigos: **AWS Account ID** `string` *required* The 12-digit account ID where the IAM user lives. **Access Key ID** `string` *required* IAM user access key ID. **Secret Access Key** `string` *required* IAM user secret access key. **Session Token** `string` Required only for temporary access keys. Credentials are stored in a Kubernetes Secret in the Central cluster — never in the connector spec. **4. Verify and create** Click **Verify & Create Connector**. Central runs connection checks, then creates the credentials Secret and `OdigosCloudConnector` resource when verification succeeds. > [!NOTE] > > Verification covers authentication and discovery permissions for the access > level you selected. For **Discovery + instrumentation**, also ensure the > instrumentation actions from the policy preview are on the role before you > create Sources. **5. Wait for Connected** After create succeeds, wait until the connector status is **Connected** and initial discovery has completed. > [!TIP] > > When the connector shows Connected, you can browse discovered workloads and > start [instrumenting](/cloud-connectors/instrument-workloads). ## Next steps > **[Instrument workloads](/cloud-connectors/instrument-workloads#add-an-otlp-destination)** > > Add an OTLP destination, create Sources for discovered Lambdas and Fargate services, and track instrumentation. > **[AWS Connector](/cloud-connectors/aws/overview)** > > Self-managed instrumentation, artifact preloading, and CDK/CloudFormation for every language. # Add a GCP Connector Source: https://docs.odigos.io/cloud-connectors/add-connectors/add-gcp-connector Connect a Google Cloud project to Odigos Central, configure authentication and capabilities, and verify discovery. Add a GCP Cloud Connector to manage **one Google Cloud project**. The connector runs in the Central cluster, discovers resources across every location in that project, and can instrument Cloud Run services when you create Sources. > [!NOTE] > > [Enable Cloud Connectors](/cloud-connectors/enable) > before you add a connector. ## Resource types | Type | Domain | Discovery | Instrumentation | | - | - | - | - | | `gcp.cloud-run` | Workload | Yes | Yes (Java, Python, Node.js, .NET) | | `gcp.gke` | Compute platform | Yes | Agent install coming soon | | `gcp.gce` | Compute platform | Yes | Agent install coming soon | ## Add the connector **1. Open Add connector and choose GCP** In the Central UI, open Connections / Connectors and start **Add connector**. Choose **GCP**. **2. Choose access level** Choose how much access this connector should have. The UI shows an **example IAM policy** for the level you pick. You will grant that role to the connector identity in the next step. ![Create Cloud Connector dialog with GCP selected and the Discovery + instrumentation access level showing a custom role policy preview](https://mintcdn.com/odigos/cif9LffayXl8I7ih/images/cloud-connectors/gcp-access-level.png?fit=max\&auto=format\&n=cif9LffayXl8I7ih\&q=85\&s=34c8e9fee0eca77f9ad43c78af69d7ac) **Discovery only** The connector can list and read resources (e.g. Cloud Run services, GKE clusters, and Compute Engine instances) but cannot change them or attach instrumentation. Use this when you want inventory and visibility first, or when a separate identity will handle instrumentation later. Typical permissions include: | Purpose | Permissions | | - | - | | Authentication / project access | `resourcemanager.projects.get` | | Cloud Run discovery | `run.services.list`, `run.services.get` | | GKE discovery | `container.clusters.list`, `container.clusters.get` | | Compute Engine discovery | `compute.instances.list` | **Discovery + instrumentation** The connector can discover resources and instrument supported workloads. Prefer this for a full setup in one step. Includes all discovery permissions, plus Cloud Run instrumentation: | Purpose | Permissions | | - | - | | Update services | `run.services.get`, `run.services.update`, `run.operations.get` | | Act as runtime service account | **`iam.serviceAccounts.actAs`** | | Language detection (optional) | `artifactregistry.repositories.downloadArtifacts` (or `roles/artifactregistry.reader`) | > [!WARNING] > > `iam.serviceAccounts.actAs` is required to update Cloud Run services that > run as a runtime service account. Without it, instrumentation fails even > when `run.services.update` is granted. Bind it in a custom role, or grant > `roles/iam.serviceAccountUser` on the runtime service account. Cloud Run instrumentation also requires an [OTLP destination](/cloud-connectors/instrument-workloads#add-an-otlp-destination) after the connector is online. That endpoint must be reachable **from Cloud Run**, because instrumented services export OTLP directly to it. **Custom** Pick which resource types may be discovered and which may be instrumented. The UI updates the **policy preview** to match your selections so the IAM role stays aligned with what verification will validate. Use Custom when you need a narrower or broader mix than the presets (e.g. discover GKE clusters but only instrument Cloud Run). > [!NOTE] > > Use the policy preview as the source of truth for the custom role. This > keeps connector access scoped — not blanket project owner. See > [You control the access scope](/cloud-connectors/overview#you-control-the-access-scope). Enable the Cloud Run, Cloud Resource Manager, Container, Compute, and IAM APIs in the project as needed, then click **Next** to continue to **Setup credentials**. **3. Setup credentials** On the **Setup credentials** screen, identify the project and enter the identity Odigos uses to access it. ![Setup credentials screen for a GCP connector with GCP Project ID, authentication method toggle, and Service Account Key JSON fields](https://mintcdn.com/odigos/cif9LffayXl8I7ih/images/cloud-connectors/gcp-setup-credentials.png?fit=max\&auto=format\&n=cif9LffayXl8I7ih\&q=85\&s=f6095c846e2453948da297a0b3632f0f) #### 1. Enter Google Cloud project **GCP Project ID** `string` *required* The Google Cloud project that contains the resources Odigos should discover. #### 2. Choose authentication method Use a service account key for local Central, or choose workload identity only when it is configured on the connector pod. **Workload identity** Odigos uses the connector pod's ambient credentials — [GKE Workload Identity](https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity) or Application Default Credentials. Prefer this when Central runs on GKE and you do not want a long-lived key in the cluster. 1. Create a Google Cloud service account (or reuse one) and grant it the **IAM role from the access level step**. 2. Bind that service account to the connector pod's Kubernetes service account via Workload Identity (or ensure ADC is otherwise available to the pod). 3. Select **Workload identity** in Odigos. Do **not** paste a JSON key — no credentials Secret is created for this method. > [!NOTE] > > A kind or non-GKE Central cluster has no ambient GCP identity. Use > **Service account key** instead. **Service account key** Use a JSON key for a dedicated service account. Prefer this for local Central (for example kind) or any cluster without Workload Identity / ADC. 1. Create a Google Cloud service account in the target project. 2. Grant it the **IAM role from the access level step**. 3. Create a JSON key for that service account. 4. Select **Service account key** in Odigos and paste the complete JSON key. **Service Account Key (JSON)** `string` *required* The full JSON key for a service account with the required roles. The key is stored in a Kubernetes Secret in the Central cluster — never in the connector spec. **4. Verify and create** Click **Verify & Create Connector**. Central runs connection checks, then creates the `OdigosCloudConnector` resource when verification succeeds. For **Service account key**, it also writes the credentials Secret; for **Workload identity**, no Secret is created. > [!NOTE] > > Verification covers authentication and discovery permissions for the access > level you selected. For **Discovery + instrumentation**, also ensure the > instrumentation permissions from the policy preview (including > `iam.serviceAccounts.actAs`) are granted before you create Sources. **5. Wait for Connected** After create succeeds, wait until the connector status is **Connected** and initial discovery has completed. > [!TIP] > > When the connector shows Connected, you can browse discovered workloads and > start [instrumenting](/cloud-connectors/instrument-workloads). ## Next steps > **[Instrument workloads](/cloud-connectors/instrument-workloads#add-an-otlp-destination)** > > Add an OTLP destination, create Sources for discovered Cloud Run services, and track instrumentation. # CDK: Destinations Source: https://docs.odigos.io/cloud-connectors/aws/cdk/destinations Configure where the Odigos AWS CDK constructs send telemetry, and which signals to enable. Both Lambda and Fargate constructs take a `destination` — where your telemetry is sent, and which OpenTelemetry signals to include. Configure it once on the construct; every workload that construct instruments uses the same settings. > [!NOTE] > > Read [Odigos AWS CDK](/cloud-connectors/aws/cdk/overview) first for install and when to use the package. > This page covers only the shared `destination` options. ## Choosing a destination You give the construct an endpoint in one of two formats, depending on which protocol your destination speaks: **destination.endpoint** `string` OTLP over **gRPC**, written as a bare `host:port` with **no** `https://` prefix — for example `otlp.example.com:4317`. Port 4317 is the convention. **destination.httpEndpoint** `string` OTLP over **HTTP**, written as a full URL **including** the scheme — for example `https://otlp.example.com:4318`. Port 4318 is the convention. The two formats aren't interchangeable, and getting them mixed up is the most common mistake here — so the construct checks: a scheme in `endpoint`, or a missing one in `httpEndpoint`, stops the build immediately rather than deploying something that starts up fine and then quietly delivers nothing. Using a port that belongs to the other protocol (4318 with gRPC, or 4317 with HTTP) produces a warning. > [!NOTE] > > **How many endpoints to set differs between the two constructs.** Lambda takes > **exactly one**. Fargate accepts **either or both**, and often should get both — > see [Fargate → Transport](/cloud-connectors/aws/cdk/fargate#transport) for why. Two more optional settings: **destination.insecure** `boolean` (default: false) Skip TLS verification. Applies to the gRPC `endpoint` only — the HTTP exporter takes its transport from the URL scheme. **destination.headers** `object` Headers sent with every request, which in practice means your destination's credential (an API key or token). > [!WARNING] > > These are stored as a plain environment variable on the workload — readable by > anyone who can describe the function or task definition, and visible in the AWS > console. For a long-lived credential, prefer a destination that authenticates by > network position (a private VPC endpoint, or mTLS), or send telemetry to a > collector you run that holds the real credential. ## Choosing which signals to send OpenTelemetry produces three kinds of data, and you choose which ones to send: **destination.traces** `boolean` (default: true) Traces — the request-by-request timelines. On by default. **destination.metrics** `boolean` (default: false) Metrics — numeric measurements over time. **Off unless you turn it on.** **destination.logs** `boolean` (default: false) Logs. **Off unless you turn it on.** ```typescript theme={null} destination: { endpoint: 'otlp.example.com:4317', metrics: true, // off unless you ask logs: true, // off unless you ask } ``` Traces are on by default because that is the primary signal most teams set up OpenTelemetry for. Metrics and logs are opt-in: enabling a signal you are not ready to receive is not free — refused batches are retried on a backoff, and on Lambda that retrying happens inside billed duration. Turn them on when you want those signals and your destination is configured to accept them. > [!WARNING] > > **Match this to what your destination in Odigos has enabled.** Odigos compares > the workload's full telemetry configuration against what it expects, so a > traces-only workload checked against a destination configured for all three > signals is reported as *drifted* — even though the workload is working fine. > Read the enabled signals off the destination in Odigos and state the same ones > here. > [!NOTE] > > Turning all three off stops the build — a workload with instrumentation but > nowhere to send anything would be silent, which is never what you meant. ## Next steps > **[Lambda construct](/cloud-connectors/aws/cdk/lambda)** > > Layer sources, web-server mode, Java handler interfaces. > **[Fargate construct](/cloud-connectors/aws/cdk/fargate)** > > Languages, service naming, the agents image. # CDK: Fargate Source: https://docs.odigos.io/cloud-connectors/aws/cdk/fargate Instrument ECS Fargate services from your CDK app with OdigosFargateInstrumentation — every option, and the edge cases to know about. `OdigosFargateInstrumentation` instruments containers running in ECS Fargate services defined in your CDK app. > [!NOTE] > > Read [Odigos AWS CDK](/cloud-connectors/aws/cdk/overview) first — it covers > installing the package and how Odigos recognizes an instrumented workload — then > [Destinations](/cloud-connectors/aws/cdk/destinations) for the shared `destination` > options. This page covers only what's specific to Fargate. ## Basic usage ```typescript theme={null} import { OdigosFargateInstrumentation, OdigosFargateLanguage } from '@odigos/aws-cdk'; const odigos = new OdigosFargateInstrumentation(this, 'Odigos', { destination: { httpEndpoint: 'https://otlp.example.com:4318' }, }); odigos.instrument({ container: apiContainer, // the container to instrument language: OdigosFargateLanguage.JAVA, // stated, not detected — see below service: apiService, // used to read the service name }); ``` You create the construct once, then call `instrument()` for each container you want instrumented. There's no automatic sweep of a whole stack — you name each container explicitly. ## How it works The construct sets up four things that work together: 1. **A shared scratch volume** on the task definition, named `odigos-agent`. 2. **An extra container**, also named `odigos-agent`, that copies the right language agent into that volume and then exits. It's marked non-essential, because finishing and exiting is its whole job — it isn't part of your running application. 3. **A read-only mount** of that volume at `/var/odigos` in your application container, which is set to wait until the copy step has finished successfully before it starts. 4. **Environment variables** on your application container that load the agent and configure where telemetry goes. > [!WARNING] > > All four are one mechanism, which is why they're one construct call rather than > four options. A container can have a perfectly correct set of environment > variables while the copy step is missing — the application then starts, finds > nothing at `/var/odigos`, and sends no telemetry while still *reporting* as > instrumented. ## Where telemetry goes **Straight from your application to your destination.** There's no intermediate collector inside the task, so your application's own OpenTelemetry exporter is what makes the network call — which means a slow or unreachable destination is felt by the application itself. Two practical consequences: the destination endpoint has to be reachable from the task's network, and it's worth pointing it somewhere with headroom, since your application is doing the sending. ## Stating the language **language** `OdigosFargateLanguage` *required* One of `JAVA`, `PYTHON`, `NODEJS`, `DOTNET`, `PHP`, `RUBY`. | Language | Loaded through | `runtimeVersion` prop | | - | - | - | | `JAVA` — also Kotlin, Scala | `JAVA_TOOL_OPTIONS` | Ignored — one agent covers the supported JVM range | | `PYTHON` | `PYTHONPATH` | Ignored — one agent covers the supported Python range | | `NODEJS` | `NODE_OPTIONS` | Ignored — one agent covers the supported Node.js range | | `DOTNET` | `CORECLR_*` / `DOTNET_*` | Ignored — one agent covers the supported .NET range | | `PHP` | `PHP_INI_SCAN_DIR` | **Required** — picks the per-version agent folder | | `RUBY` | `RUBYOPT` | **Required** — picks the per-version agent folder | There's no auto-detection here, and that's a platform constraint rather than a preference. A container declares only an *image* — nothing in the task definition says which language runs inside it. Working that out would mean downloading and inspecting the image, which is network I/O a build can't do. So you state it. > [!WARNING] > > A wrong language here fails quietly. Staging the Java agent into a Python > container leaves it uninstrumented, and setting `JAVA_TOOL_OPTIONS` on an image > with no JVM is simply ignored — nothing errors loudly enough to notice. **runtimeVersion** `string` Your application's language version as `major.minor` — for example `"8.3"` or `"3.3"`. Required for PHP and Ruby (their agents are laid out per version in the bundle). Ignored for Java, Python, Node.js, and .NET — those ship one agent that covers a range of runtime versions, so you don't declare which one. > [!WARNING] > > PHP and Ruby agents are stored per version inside the bundle, and this value > selects the folder the loader points at. Anything other than an exact > `major.minor` names a folder that doesn't exist, and the container starts with > no agent at all. > [!NOTE] > > **Go can't be instrumented on Fargate at all** — not an omission, a platform > limit. Go's only zero-code instrumentation is eBPF-based, and Fargate doesn't > allow the privileged access eBPF needs. Use the OpenTelemetry Go SDK in your code > instead. ## Naming your service `OTEL_SERVICE_NAME` here **must be the ECS service's name** — not the task definition family, and not the container name. Odigos compares it against the workload's name, and a mismatch is reported as drift rather than treated as a naming preference. There's no default, so you set one of these two: **service** `ecs.BaseService` The ECS service running this task definition. Only its name is read. **serviceName** `string` The name directly — use this when the service is defined somewhere else (another stack, Terraform, or the console). > [!WARNING] > > The service's name has to be one your stack **sets explicitly**. A name > CloudFormation generates is a reference to the service, and a task definition > referring back to the service that runs it is a circular dependency > CloudFormation rejects. A generated name stops the build and points you at > `serviceName`. ## Variables your container already sets For Java, Node.js, and Python, the construct reads whatever your container already has in its loader variable and **adds to it** — joined by that language's separator (a space for Java and Node.js, a colon for Python): ```typescript theme={null} taskDefinition.addContainer('App', { image, environment: { JAVA_TOOL_OPTIONS: '-Xmx512m' }, }); // result: -Xmx512m -javaagent:/var/odigos/java/javaagent.jar ``` **existingLoaderValue** `string` Only needed as an override — pass this when the existing value isn't visible to CDK at build time, because it comes from an `environmentFiles` entry, the image's own `ENV`, or `secrets`. > [!WARNING] > > **PHP and Ruby work differently.** Odigos compares `PHP_INI_SCAN_DIR` and > `RUBYOPT` exactly, so they're set outright rather than added to. If your container > already sets one, you get a build warning — fold whatever your application needs > into the value Odigos sets. ## Transport Fargate accepts **both** endpoint formats at once, and often should get both: ```typescript theme={null} destination: { endpoint: 'otlp.example.com:4317', // OTLP/gRPC httpEndpoint: 'https://otlp.example.com:4318', // OTLP/HTTP } ``` Every agent in the bundle prefers HTTP. Java, Python, Node.js, and .NET will fall back to gRPC if that's all you provide. Giving both lets each language use what it prefers. > [!WARNING] > > **PHP and Ruby can only speak HTTP** — > Instrumenting a PHP or Ruby container against a gRPC-only destination stops the > build, rather than deploying a task that silently sends nothing. ## Instrumenting several containers A task definition holding more than one application — in more than one language — is a normal shape. Call `instrument()` once per container, or use `instrumentAll()`: ```typescript theme={null} odigos.instrumentAll([ { container: apiContainer, language: OdigosFargateLanguage.JAVA, service: svc }, { container: workerContainer, language: OdigosFargateLanguage.PYTHON, service: svc }, ]); ``` There's still only **one** copy-step container for the whole task definition — it just copies every language that's needed. > [!NOTE] > > AWS allows at most 10 containers per task definition, and the copy step needs one > of them. A task definition already at the limit stops the build, rather than > failing later during deployment. ## The agents image The copy step pulls its files from an image. Leave this unset unless your tasks cannot reach the public registry — the construct defaults to `registry.odigos.io/odigos-fargate-agents` at the tag this package release ships (multi-arch: Intel and ARM/Graviton). > [!WARNING] > > **This image is pulled by your task's execution role every time a task starts.** A > task in a private subnet with no NAT gateway and no registry endpoint can't reach > the default public registry, and the pull failure will block your application > container from starting. **agentsImage** `string` Only set this if tasks cannot pull from `registry.odigos.io` (or your org requires images to live in a registry you own). Point the copy step at your own mirror: ```typescript theme={null} agentsImage: '111122223333.dkr.ecr.eu-west-1.amazonaws.com/odigos-fargate-agents:v0.0.15', ``` See [Preload the Fargate agents image](/cloud-connectors/aws/workloads/fargate/preload) for how to build that mirror. The image is a normal container image whose filesystem holds the language agents (under `/instrumentations//…`). The construct sets environment variables that point at those exact paths after the copy step stages them into `/var/odigos`. A private-registry override must therefore be a **byte-for-byte mirror** of that image — retag and push the published `odigos-fargate-agents` image; do not rebuild or rearrange it. See [Preload the Fargate agents image](/cloud-connectors/aws/workloads/fargate/preload) for the mirror steps (and [Amazon ECR private registries](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) if you need the AWS side of hosting it). The agents themselves are Linux and glibc only: a Windows task definition stops the build, and Alpine/musl application images have no .NET profiler available. Whichever image you use is recorded in the `ODIGOS_IAC` marker, and Odigos holds the task to *that* image rather than to whatever the connector's own build happens to use. Two useful consequences: * Your mirror is judged against itself, not flagged for differing from the default. * Upgrading this package ahead of the connector isn't drift either — the service stays conformant until you redeploy. > [!NOTE] > > What *is* reported: two containers in the same task definition recording different > agents images. There's one copy step and it can't stage two different images. ## API reference | Export | What it is | | - | - | | `OdigosFargateInstrumentation` | The construct. Methods: `instrument(target)`, `instrumentAll(targets)`. | | `OdigosFargateTarget` | One container to instrument: `container`, `language`, `service` or `serviceName`, `runtimeVersion`, `existingLoaderValue`. | | `OdigosFargateLanguage` | `JAVA` \| `PYTHON` \| `NODEJS` \| `DOTNET` \| `PHP` \| `RUBY` | | `sidecarCommand`, `evaluateAppendPattern`, `appendSeparator` | The copy-step command and loader-value rendering, if you want to inspect what they produce. | | `FARGATE_AGENTS_IMAGE` | The agents image this package version uses by default. | | `FARGATE_DISTROS_VERSION` | The Odigos distros release the activation recipes were mirrored from. | ## Next steps > **[CDK overview](/cloud-connectors/aws/cdk/overview)** > > Install, constructs, and how Odigos recognizes instrumented workloads. > **[Destinations](/cloud-connectors/aws/cdk/destinations)** > > Endpoint formats, credentials, and which signals to enable. > **[Preload the agents image](/cloud-connectors/aws/workloads/fargate/preload)** > > Mirror the image into a registry your tasks can reach. # CDK: Lambda Source: https://docs.odigos.io/cloud-connectors/aws/cdk/lambda Instrument AWS Lambda functions from your CDK app with OdigosLambdaInstrumentation — every option, and the edge cases to know about. `OdigosLambdaInstrumentation` instruments AWS Lambda functions defined in your CDK app. > [!NOTE] > > Read [Odigos AWS CDK](/cloud-connectors/aws/cdk/overview) first — it covers > installing the package and how Odigos recognizes an instrumented workload — then > [Destinations](/cloud-connectors/aws/cdk/destinations) for the shared `destination` > options. This page covers only what's specific to Lambda. ## Basic usage ```typescript theme={null} import { OdigosLambdaInstrumentation } from '@odigos/aws-cdk'; new OdigosLambdaInstrumentation(this, 'Odigos', { destination: { endpoint: 'otlp.example.com:4317' }, functions: [apiFn, workerFn], }); ``` Typically you define **one** `OdigosLambdaInstrumentation` per CDK stack and pass it every function you want instrumented. One construct does everything for every function you list: attaches the right OpenTelemetry layer for that function's language and CPU architecture, sets the variable that loads it, configures where telemetry goes, and writes the `ODIGOS_IAC` marker. `serviceName` (and other construct-level options) apply to **every** function on that construct. If each function needs its own `serviceName`, define **one construct per function** instead of listing them together. The same applies whenever any other setting must differ. To instrument every function in the stack without listing them, use the [Aspect](#instrumenting-every-function-in-a-stack) instead. Languages supported: **Python, Node.js, Java, Ruby.** Other runtimes — Go, .NET, and custom runtimes — have no OpenTelemetry Lambda layer, so they can't be instrumented this way. > [!NOTE] > > You can also call `instrument(fn)` or `instrumentAll([fn1, fn2])` on the construct > after creating it, instead of passing `functions` up front. ## How telemetry leaves the function This is worth understanding because it explains several of the options below. Your function's OpenTelemetry SDK does **not** send data to your destination directly. It sends it to a small collector that ships inside the Odigos layer and runs in the same Lambda sandbox, reachable on `localhost`. That collector then forwards the data to your real destination — **after** your handler has already returned its response to the caller. That extra hop is the entire point: if your destination is slow or briefly unreachable, the delay lands on billed duration rather than on the response your user is waiting for. (A `decouple` processor inside the collector keeps the sandbox alive just long enough to finish sending before Lambda freezes it, so a low-traffic function doesn't lose its telemetry.) > [!WARNING] > > This is why the construct never sets `OTEL_EXPORTER_OTLP_ENDPOINT`. If you set it > yourself, you point the SDK straight at your destination and put the network call > back on the critical path of every single invocation — undoing the whole design. ## Where the layer comes from **layerSource** `OdigosLayerSource` (default: ODIGOS\_PUBLIC) Which copy of the OpenTelemetry layer your functions attach. | | `ODIGOS_PUBLIC` (default) | `IN_ACCOUNT` | | - | - | - | | What it adds to your stack | Just a reference to a layer | A nested stack per language/architecture in use | | Who owns the layer | Odigos' AWS account | **Your** account, created by your own stack | | When it's resolved | At build time, from a table inside the package | At deploy time, from AWS Serverless Application Repository | | Works without a fixed region | No — needs a concrete region | Yes | | First deploy | Unchanged | Slower | ```typescript theme={null} new OdigosLambdaInstrumentation(this, 'Odigos', { destination: { endpoint: 'otlp.example.com:4317' }, functions: [fn], layerSource: OdigosLayerSource.IN_ACCOUNT, }); ``` Both options install byte-for-byte identical instrumentation. **`IN_ACCOUNT` is the SAR preload path for CDK**: the construct nests an AWS Serverless Application Repository application into your stack, which publishes an `AWS::Lambda::LayerVersion` owned by **your** account and wires its ARN onto the function. You do not deploy SAR by hand when using this option. Use `IN_ACCOUNT` if your organization's policy forbids attaching a Lambda layer owned by an outside AWS account. It needs the principal running `cdk deploy` to hold `serverlessrepo:CreateCloudFormationTemplate` and `serverlessrepo:GetApplication`. For the same preload outside CDK (Console, CloudFormation/SAM) — or to see the Application IDs and `SemanticVersion` the construct pins — see [Preload the Lambda layer](/cloud-connectors/aws/workloads/lambda/preload). **layerVersion** `lambda.ILayerVersion` Escape hatch: attach a specific layer you already own, and **skip `layerSource` entirely** — neither `ODIGOS_PUBLIC` nor `IN_ACCOUNT` is consulted when this is set. Pass any CDK [`ILayerVersion`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda.ILayerVersion.html) — typically `LayerVersion.fromLayerVersionArn(...)` pointing at a layer you mirrored into your account, or a `LayerVersion` construct you already defined. There is no separate allow-list: the construct attaches whatever you pass. The layer **must** be the Odigos OpenTelemetry layer (same bytes / script layout as the public or SAR layer). Environment variables assume paths inside that layout; a different layer will attach but fail to instrument at runtime. ```typescript theme={null} import * as lambda from 'aws-cdk-lib/aws-lambda'; new OdigosLambdaInstrumentation(this, 'Odigos', { destination: { endpoint: 'otlp.example.com:4317' }, functions: [fn], layerVersion: lambda.LayerVersion.fromLayerVersionArn( this, 'OdigosLayer', 'arn:aws:lambda:eu-west-1:111122223333:layer:odigos-otel-python-arm64:1', ), }); ``` One `layerVersion` is used for **every** function on this construct, so those functions must share a language and architecture that match that layer. Prefer `layerSource` when you need the construct to pick the right layer per function. ## Normal functions vs. web-server functions **mode** `OdigosInstrumentationMode` (default: HANDLER) `HANDLER` is for an ordinary Lambda function — one that exports a handler and gets invoked per event. `WEB_SERVER` is for a function that runs an actual web server behind the [AWS Lambda Web Adapter](https://github.com/awslabs/aws-lambda-web-adapter). The difference matters because both Odigos and the Web Adapter want to use the same Lambda setting (`AWS_LAMBDA_EXEC_WRAPPER`) to hook into startup. In `WEB_SERVER` mode, Odigos leaves that setting to the adapter and loads instrumentation a different way instead. > [!WARNING] > > **Using `HANDLER` on a web-adapter function overwrites the adapter's setting and > the function stops serving traffic.** There's deliberately no auto-detection: > spotting the adapter would mean inspecting the function's other layers, which CDK > often can't resolve until deploy time — and a detector that was right most of the > time would silently break exactly the functions it got wrong. So you state it. ```typescript theme={null} new OdigosLambdaInstrumentation(this, 'Odigos', { destination: { endpoint: 'otlp.example.com:4317' }, functions: [webFn], mode: OdigosInstrumentationMode.WEB_SERVER, existingLoaderValue: '--max-old-space-size=2048', }); ``` **existingLoaderValue** `string` In `WEB_SERVER` mode, Odigos loads instrumentation through your language's own startup variable — `NODE_OPTIONS`, `JAVA_TOOL_OPTIONS`, or `PYTHONPATH`. If your function already needs a value in that variable, pass it here and Odigos adds to it instead of replacing it. > [!WARNING] > > CDK can't read back an environment variable your app set elsewhere, so this > can't be detected automatically. Omit it and the variable is set to **only** > the Odigos value — for `NODE_OPTIONS`, that can silently drop a flag your > application needs to start. > [!NOTE] > > Ruby functions are not supported in WEB\_SERVER mode because a verified web-server loader is currently unavailable. ## Java functions: pick the matching handler type The Java layer ships four different wrapper scripts, one per Lambda handler interface. This is a correctness setting, not a level-of-detail setting. **javaHandlerDistro** `OdigosJavaHandlerDistro` (default: OTEL\_HANDLER) ```typescript theme={null} javaHandlerDistro: OdigosJavaHandlerDistro.OTEL_STREAM_HANDLER ``` | Value | Use it for | | - | - | | `OTEL_HANDLER` (default) | A `RequestHandler` function | | `OTEL_PROXY_HANDLER` | API Gateway proxy events — produces richer spans | | `OTEL_SQS_HANDLER` | SQS events — produces richer spans | | `OTEL_STREAM_HANDLER` | A `RequestStreamHandler` function | > [!WARNING] > > The default installs a `RequestHandler` implementation. A function that actually > implements `RequestStreamHandler` has a completely different method signature, so > the default **breaks the invocation** — it doesn't merely produce thinner traces. ## Instrumenting every function in a stack ```typescript theme={null} Aspects.of(stack).add(new OdigosInstrumentationAspect(stack, { destination: { endpoint: 'otlp.example.com:4317' }, })); ``` This visits every Lambda function in the stack. **skipUnsupportedRuntimes** `boolean` (default: false (true on the aspect)) What to do when a function's runtime has no OpenTelemetry layer (Go, .NET, custom runtimes). The aspect defaults to `true`: skip it with a build **warning** rather than failing. The single-function construct defaults to `false`, because naming one specific Go function and asking for it to be instrumented is a mistake worth stopping the build over. ## Naming your service `OTEL_SERVICE_NAME` is what your function shows up as in your observability tool. **serviceName** `string` Left unset, this becomes the function's real name when your stack sets one explicitly, and the CDK construct ID otherwise. That fallback exists for a structural reason: a function name that CloudFormation generates for you is a reference to the function itself, and a function referring to its own generated name inside its own configuration is a circular dependency that CloudFormation refuses to deploy. > [!WARNING] > > Odigos compares this against the function's real AWS name. **If your function's > name is auto-generated, set `serviceName` explicitly** — otherwise Odigos reports > it as drifted. Note that `serviceName` applies to *every* function in a single > construct, so use one construct per function when you need different names. ## Other things worth knowing > **Functions this construct can't instrument** > > A container-image function (`DockerImageFunction`) can't carry Lambda layers at all. The construct also > needs a function your own stack owns — one imported with `Function.fromFunctionArn` can't be modified > by CDK. > **Layer limits** > > AWS allows a maximum of 5 layers per function. Also don't attach the Odigos layer through more than one > route at once — two versions of the same layer is reported as a conflict. ## API reference | Export | What it is | | - | - | | `OdigosLambdaInstrumentation` | The construct. Methods: `instrument(fn)`, `instrumentAll(fns)`. | | `OdigosInstrumentationAspect` | Applies instrumentation to every function in a scope. | | `OdigosLayerSource` | `ODIGOS_PUBLIC` \| `IN_ACCOUNT` | | `OdigosInstrumentationMode` | `HANDLER` \| `WEB_SERVER` | | `OdigosJavaHandlerDistro` | The four Java handler wrappers. | | `renderCollectorConfig` | The same collector-config renderer the construct uses, if you want to inspect what it produces. | | `LAYER_ARNS`, `ODIGOS_VERSION` | The public layer-ARN table baked into the package (`ODIGOS_PUBLIC`), and the Odigos release it came from. | | `SAR_APPLICATIONS`, `SAR_SEMANTIC_VERSION` | What `IN_ACCOUNT` deploys under the hood: SAR Application IDs keyed by `language/architecture`, and the pinned semantic version (same bytes as this package release). You normally do **not** import these — set `layerSource: IN_ACCOUNT` instead. Use them only if you're authoring your own SAR/`AWS::Serverless::Application` template; the step-by-step is in [Preload the Lambda layer](/cloud-connectors/aws/workloads/lambda/preload). | ## Related Topics > **[CDK overview](/cloud-connectors/aws/cdk/overview)** > > Install, constructs, and how Odigos recognizes instrumented workloads. > **[Destinations](/cloud-connectors/aws/cdk/destinations)** > > Endpoint formats, credentials, and which signals to enable. > **[Preload the layer](/cloud-connectors/aws/workloads/lambda/preload)** > > Put the layer in your own account for `IN_ACCOUNT`. # Odigos AWS CDK Source: https://docs.odigos.io/cloud-connectors/aws/cdk/overview What the Odigos AWS CDK package is, when to use it, and how Odigos recognizes instrumented workloads. The Odigos AWS CDK package adds OpenTelemetry instrumentation to your AWS workloads from inside your own [AWS CDK](https://aws.amazon.com/cdk/) application — so instrumentation ships through the same pipeline as the rest of your infrastructure, reviewed in a pull request and applied by `cdk deploy`. > [!NOTE] > > **New to this?** AWS CDK is a tool for describing cloud infrastructure in a > programming language instead of a YAML template. If your team doesn't use CDK, > you don't need this section — use the CloudFormation instructions on > [Instrument Lambda](/cloud-connectors/aws/workloads/lambda/instrument) or > [Instrument Fargate](/cloud-connectors/aws/workloads/fargate/instrument), or let > Odigos apply instrumentation for you. ## When you'd use this Odigos can instrument your workloads two ways, and the CDK package is for the second one: | | Odigos-managed | Self-managed, with this package | | - | - | - | | Who changes the workload | Odigos, automatically | Your CDK app, on `cdk deploy` | | Where instrumentation is defined | In Odigos | In your own source code | | What Odigos does | Applies and maintains it | Watches and reports | Pick self-managed when your infrastructure code should stay the single source of truth for what's deployed. Pick Odigos-managed when you'd rather not touch your infrastructure code at all. Full comparison: [Odigos-managed vs. self-managed instrumentation](/cloud-connectors/overview#odigos-managed-vs-self-managed-instrumentation). > [!WARNING] > > Don't do both to the same workload. If a function or service is instrumented by > your CDK app **and** also enabled as an Odigos-managed source, each side keeps > reasserting its own configuration — every deploy fights every reconcile, and each > round trip creates a new Lambda version or ECS task revision. Pick one per > workload. ## Install ```bash theme={null} npm install @odigos/aws-cdk ``` > [!NOTE] > > **TypeScript and JavaScript only, for now.** A Python distribution > (`odigos-aws-cdk`) is built but not yet published — it's waiting on package-index > approval. Until it's out, Python CDK apps should use the > [CloudFormation instructions](/cloud-connectors/aws/workloads/lambda/instrument#using-cloudformation-directly) > instead. Pin an exact version. **The package version *is* the instrumentation version** — `@odigos/aws-cdk@0.0.15` installs the OpenTelemetry layer and agents bundle built by Odigos release `v0.0.15`, and nothing resolves or moves at deploy time. Upgrading is a deliberate `npm update` followed by a `cdk diff` that shows you exactly what changes. An instrumentation agent that silently updated itself under a deployment that changed nothing is not a property you want. ## The two constructs | | Lambda | ECS Fargate | | - | - | - | | Construct | `OdigosLambdaInstrumentation` | `OdigosFargateInstrumentation` | | How the agent gets there | A Lambda layer attached to the function | Copied into the task by an extra short-lived container | | Languages | Python, Node.js, Java, Ruby | Java, Python, Node.js, .NET, PHP, Ruby | | Where telemetry goes | To a collector inside the same Lambda sandbox, which forwards it on after your handler returns | Straight from your application to your destination | | How the language is determined | Automatically, from the function's runtime | You state it explicitly | > **[Lambda construct](/cloud-connectors/aws/cdk/lambda)** > > Every option for instrumenting Lambda functions. > **[Fargate construct](/cloud-connectors/aws/cdk/fargate)** > > Every option for instrumenting ECS Fargate services. Configure where telemetry goes and which signals to enable on [CDK: Destinations](/cloud-connectors/aws/cdk/destinations) — both constructs share the same `destination` options. ## How Odigos recognizes your workload Both constructs write an environment variable called **`ODIGOS_IAC`** onto everything they instrument. This is the one thing that tells Odigos "this workload is instrumented, and here's what with." > [!WARNING] > > Without that marker, Odigos reports the workload as **awaiting your deployment** — > no matter how completely everything else was applied. The constructs write it for > you, so there's nothing to switch on; it matters mainly because you'll see it in > a `cdk diff`, and because hand-written instrumentation has to include it too. The marker also records *which version* of instrumentation you deployed — the layer ARN on Lambda, the agents image on Fargate. That's what lets you pin a version and have Odigos respect it, rather than reporting your deliberately-pinned workload as out of date the day Odigos publishes something newer. > [!WARNING] > > There's a second marker, **`ODIGOS_MANAGED`**, that these constructs never write — > and neither should you. That one is Odigos' own record of a change *it* made, > including the snapshot it would undo that change with. Writing it by hand claims a > rollback point that doesn't exist. ## Turning on debug logging **debug** `boolean` (default: false) Makes the OpenTelemetry agent log verbosely, which helps when telemetry isn't arriving and you need to see why. Available on both constructs. > [!WARNING] > > Leave it off once you're done. It's expensive at volume, and Odigos expects it > **off** unless debug telemetry is also enabled on the connector — so leaving it > on can itself be reported as drift. ## Next steps > **[Destinations](/cloud-connectors/aws/cdk/destinations)** > > Endpoint formats, credentials, and which signals to enable. > **[Lambda construct](/cloud-connectors/aws/cdk/lambda)** > > Layer sources, web-server mode, Java handler interfaces. > **[Fargate construct](/cloud-connectors/aws/cdk/fargate)** > > Languages, service naming, the agents image. # AWS Connector Source: https://docs.odigos.io/cloud-connectors/aws/overview How the AWS Cloud Connector works end to end: resource types, Odigos-managed vs. self-managed instrumentation, languages, and where to go next. The AWS Connector is one running instance that owns **one AWS account**. It scans every region enabled in that account, discovers Lambda functions and ECS/Fargate resources, and — for the types you allow — either instruments them for you or reports on instrumentation you applied yourself. This page is the map. For hands-on tasks, see: > **[Add an AWS Connector](/cloud-connectors/add-connectors/add-aws-connector)** > > Connect an account, choose an access level, and verify discovery. > **[Preload Lambda layer](/cloud-connectors/aws/workloads/lambda/preload)** > > Preload the Lambda layer into your own account for IaC. > **[Preload Fargate image](/cloud-connectors/aws/workloads/fargate/preload)** > > Mirror the Fargate agents image into a private registry. > **[Instrument Lambda](/cloud-connectors/aws/workloads/lambda/instrument)** > > Self-managed Lambda instrumentation for Java, Python, Node.js, and Ruby. > **[Instrument Fargate](/cloud-connectors/aws/workloads/fargate/instrument)** > > Self-managed Fargate instrumentation with CloudFormation for every supported language. > **[CDK reference: Lambda](/cloud-connectors/aws/cdk/lambda)** > > Every option on the Lambda CDK construct, in depth. > **[CDK reference: Fargate](/cloud-connectors/aws/cdk/fargate)** > > Every option on the Fargate CDK construct, in depth. ## Resource types The connector splits AWS resources into two domains — **workloads**, which it can instrument directly, and **compute platforms**, which it can only discover today: | Type | Domain | Discovery | Instrumentation | | - | - | - | - | | `aws.lambda` | Workload | Yes | Yes — Odigos-managed or self-managed | | `aws.fargate-task` | Workload | Yes | Yes — Odigos-managed or self-managed | | `aws.ecs-cluster` | Compute platform | Yes | Coming soon (agent install) | | `aws.fargate-cluster` | Compute platform | Yes | n/a (coverage only) | > [!NOTE] > > `aws.fargate-task` means an ECS **service** running on Fargate — the service, not > the task, is the unit of instrumentation, because task ARNs are recycled on every > deploy while the service is a stable identity. A standalone task started outside > a service (for example by `RunTask` or EventBridge) can be discovered but cannot > be instrumented — there is no service to roll a new revision onto. ### EC2-launch-type ECS is a separate story Everything on this page and in the AWS Connector section covers **Fargate**-launch-type ECS. EC2-launch-type ECS clusters are discovered as `aws.ecs-cluster` compute platforms, but Fargate forbids the privileged containers eBPF instrumentation needs, so EC2-backed clusters are covered by a different, cluster-wide agent rather than the per-service sidecar described here. That agent's automatic deployment is not yet available — today `aws.ecs-cluster` gives you discovery and coverage only. ## Odigos-managed vs. self-managed Both workload types support two independent modes, chosen per type when you add or edit the connector. This is a connector-wide concept — see [Odigos-managed vs. self-managed instrumentation](/cloud-connectors/overview#odigos-managed-vs-self-managed-instrumentation) for the general rules (the marker system, why you should pick one mode per workload, and so on). On AWS specifically: | Mode | Lambda | Fargate | | - | - | - | | **Odigos-managed** | The connector attaches the OpenTelemetry layer and sets the required environment directly on the function, and keeps it there. | The connector injects an `odigos-agent` sidecar into the service's task definition and rolls the service to the new revision, then keeps reconciling it. | | **Self-managed (IaC)** | You attach the layer and environment yourself via CloudFormation, the Odigos CDK construct, Terraform, or the AWS CLI. | You add the sidecar and environment yourself via CloudFormation or the Odigos CDK construct (`@odigos/aws-cdk`). | Self-managed is the default the moment you enable discovery without instrumentation for a type — nothing extra to configure. See [Instrument Lambda](/cloud-connectors/aws/workloads/lambda/instrument) and [Instrument Fargate](/cloud-connectors/aws/workloads/fargate/instrument) for the actual snippets, and [Preload Lambda layer](/cloud-connectors/aws/workloads/lambda/preload) / [Preload Fargate image](/cloud-connectors/aws/workloads/fargate/preload) for getting artifacts into your own account first if your organization requires that. ## Supported languages | Workload | Languages | Notes | | - | - | - | | Lambda (`aws.lambda`) | Java, Python, Node.js, Ruby | Ruby: OTLP HTTP destinations only. Other runtimes (Go, .NET) are discovered but not instrumented. | | Fargate (`aws.fargate-task`) | Java, Python, Node.js, .NET, PHP, Ruby | PHP and Ruby: OTLP HTTP destinations only. .NET requires a glibc (not musl/Alpine) base image. Go and any other eBPF-based language cannot be instrumented on Fargate at all. | **If a task runs more than one container** — for example, an nginx or Envoy proxy sitting in front of your application — Odigos has to pick which one is the actual application to instrument. It does this by looking at what's really running inside each container, not by which one has a public port. That distinction matters: the proxy is usually the container with the port mapping, but the proxy has no code to instrument — it's the application container behind it that needs the agent. Picking by port would target the wrong container entirely. If Odigos can't confidently identify exactly one application container — none of them look like an app, or more than one equally do — it marks the task **unsupported** rather than guessing. The same happens if the task definition is already at AWS's 10-container limit, since there's no room left for the extra container Odigos needs to add. ## Telemetry export Both Lambda and Fargate export OTLP only, and the destination must be reachable from the workload itself: * **Lambda** ships an in-process collector inside the layer. Your function's SDK exports to `localhost` inside the same sandbox; the collector forwards to your configured destination *after* the handler returns, so a slow or unreachable destination costs billed duration, not response latency. * **Fargate** has no node-local collector — each instrumented task exports **directly** to the destination over its own network path. The destination endpoint must be reachable from the task's VPC (public IP or NAT for a registry pull, plus whatever egress the destination itself needs). ## Next steps Self-managed instrumentation — pick your workload: > **[Instrument Lambda](/cloud-connectors/aws/workloads/lambda/instrument)** > > CloudFormation or CDK for Lambda functions. > **[Instrument Fargate](/cloud-connectors/aws/workloads/fargate/instrument)** > > CloudFormation for ECS Fargate task definitions. Using `@odigos/aws-cdk`? Start from the [CDK overview](/cloud-connectors/aws/cdk/overview) (install, destinations, markers), then the Lambda or Fargate construct reference. Still setting up the connector? See [Add an AWS Connector](/cloud-connectors/add-connectors/add-aws-connector). For Odigos-managed Sources after the connector is online, create them in Central once an OTLP destination is configured. # Instrument Fargate with CloudFormation Source: https://docs.odigos.io/cloud-connectors/aws/workloads/fargate/instrument Self-managed ECS Fargate instrumentation for Java, Python, Node.js, .NET, PHP, and Ruby using hand-written CloudFormation. This page shows how to instrument an ECS **service** running on Fargate yourself via CloudFormation, by editing its task definition directly — no changes made by the connector on your behalf. Odigos still discovers the service and reports its status once your changes are in place; see [Odigos-managed vs. self-managed instrumentation](/cloud-connectors/overview#odigos-managed-vs-self-managed-instrumentation) for how that works. > [!NOTE] > > Prefer the Odigos CDK construct? See > [CDK: Fargate](/cloud-connectors/aws/cdk/fargate). This page is the > hand-written CloudFormation / raw ECS form of the same change. ## How it works Self-managed Fargate instrumentation adds one extra container to your task definition, plus a handful of environment variables on your application container. Here's what happens each time the task starts: 1. A small helper container, **`odigos-agent`**, starts first. It copies the files your application's language agent needs into a shared volume, then exits. It's marked non-essential, since its only job is to prepare files — it isn't part of your running application. 2. Your **application container** waits for step 1 to finish successfully before it starts (`DependsOn: ... Condition: SUCCESS`) — this guarantees the agent files are already in place by the time your code runs. 3. Your application container picks up the agent through environment variables specific to its language — for example `JAVA_TOOL_OPTIONS` for Java — and begins exporting telemetry. > [!NOTE] > > There's no intermediate collector inside the task — each Fargate task sends > telemetry **directly** to your OTLP destination, so that destination's endpoint > must be reachable from the task's network. See > [Telemetry export](/cloud-connectors/aws/overview#telemetry-export). ## CloudFormation Merge these properties into your task definition. Only the exact agent path, activation variable, and network protocol change per language. Pick yours below: **Java** ```yaml theme={null} # Merge into Resources..Properties Volumes: - Name: odigos-agent # ephemeral-storage bind mount, scoped to the task ContainerDefinitions: - Name: odigos-agent Image: "registry.odigos.io/odigos-fargate-agents:" Essential: false Command: ["sh", "-c", "mkdir -p /var/odigos && cp -r /instrumentations/java /var/odigos/java"] MountPoints: - SourceVolume: odigos-agent ContainerPath: /var/odigos - Name: "" # ... your existing configuration ... MountPoints: - SourceVolume: odigos-agent ContainerPath: /var/odigos ReadOnly: true DependsOn: - ContainerName: odigos-agent Condition: SUCCESS Environment: - Name: ODIGOS_IAC Value: '{"v":1,"lang":"java"}' - Name: OTEL_SERVICE_NAME Value: "" - Name: OTEL_RESOURCE_ATTRIBUTES Value: "cloud.provider=aws,cloud.platform=aws_ecs,cloud.region=" - Name: OTEL_EXPORTER_OTLP_ENDPOINT Value: "" - Name: OTEL_EXPORTER_OTLP_PROTOCOL Value: "http/protobuf" # or "grpc" — must match your destination; see note below - Name: OTEL_TRACES_EXPORTER Value: "otlp" - Name: OTEL_METRICS_EXPORTER Value: "otlp" - Name: OTEL_LOGS_EXPORTER Value: "otlp" # APPEND after any existing value, joined by a space — assigning discards yours. - Name: JAVA_TOOL_OPTIONS Value: " -javaagent:/var/odigos/java/javaagent.jar" ``` **Python** ```yaml theme={null} # Merge into Resources..Properties Volumes: - Name: odigos-agent ContainerDefinitions: - Name: odigos-agent Image: "registry.odigos.io/odigos-fargate-agents:" Essential: false Command: ["sh", "-c", "mkdir -p /var/odigos && cp -r /instrumentations/python /var/odigos/python"] MountPoints: - SourceVolume: odigos-agent ContainerPath: /var/odigos - Name: "" # ... your existing configuration ... MountPoints: - SourceVolume: odigos-agent ContainerPath: /var/odigos ReadOnly: true DependsOn: - ContainerName: odigos-agent Condition: SUCCESS Environment: - Name: ODIGOS_IAC Value: '{"v":1,"lang":"python"}' - Name: OTEL_SERVICE_NAME Value: "" - Name: OTEL_RESOURCE_ATTRIBUTES Value: "cloud.provider=aws,cloud.platform=aws_ecs,cloud.region=" - Name: OTEL_EXPORTER_OTLP_ENDPOINT Value: "" - Name: OTEL_EXPORTER_OTLP_PROTOCOL Value: "http/protobuf" - Name: OTEL_TRACES_EXPORTER Value: "otlp" - Name: OTEL_METRICS_EXPORTER Value: "otlp" - Name: OTEL_LOGS_EXPORTER Value: "otlp" - Name: OTEL_PYTHON_CONFIGURATOR Value: "odigos-python-configurator" # APPEND after any existing value, joined by ":" — assigning discards yours. - Name: PYTHONPATH Value: ":/var/odigos/python:/var/odigos/python/opentelemetry/instrumentation/auto_instrumentation" ``` **Node.js** ```yaml theme={null} # Merge into Resources..Properties Volumes: - Name: odigos-agent ContainerDefinitions: - Name: odigos-agent Image: "registry.odigos.io/odigos-fargate-agents:" Essential: false Command: ["sh", "-c", "mkdir -p /var/odigos && cp -r /instrumentations/nodejs /var/odigos/nodejs"] MountPoints: - SourceVolume: odigos-agent ContainerPath: /var/odigos - Name: "" # ... your existing configuration ... MountPoints: - SourceVolume: odigos-agent ContainerPath: /var/odigos ReadOnly: true DependsOn: - ContainerName: odigos-agent Condition: SUCCESS Environment: - Name: ODIGOS_IAC Value: '{"v":1,"lang":"nodejs"}' - Name: OTEL_SERVICE_NAME Value: "" - Name: OTEL_RESOURCE_ATTRIBUTES Value: "cloud.provider=aws,cloud.platform=aws_ecs,cloud.region=" - Name: OTEL_EXPORTER_OTLP_ENDPOINT Value: "" - Name: OTEL_EXPORTER_OTLP_PROTOCOL Value: "http/protobuf" - Name: OTEL_TRACES_EXPORTER Value: "otlp" - Name: OTEL_METRICS_EXPORTER Value: "otlp" - Name: OTEL_LOGS_EXPORTER Value: "otlp" # APPEND after any existing value, joined by a space — assigning discards yours. - Name: NODE_OPTIONS Value: " --require /var/odigos/nodejs/node_modules/@opentelemetry/auto-instrumentations-node/build/src/register.js" ``` **.NET** ```yaml theme={null} # Merge into Resources..Properties Volumes: - Name: odigos-agent ContainerDefinitions: - Name: odigos-agent Image: "registry.odigos.io/odigos-fargate-agents:" Essential: false Command: ["sh", "-c", "mkdir -p /var/odigos && cp -r /instrumentations/dotnet /var/odigos/dotnet"] MountPoints: - SourceVolume: odigos-agent ContainerPath: /var/odigos - Name: "" # ... your existing configuration ... MountPoints: - SourceVolume: odigos-agent ContainerPath: /var/odigos ReadOnly: true DependsOn: - ContainerName: odigos-agent Condition: SUCCESS Environment: - Name: ODIGOS_IAC Value: '{"v":1,"lang":"dotnet"}' - Name: OTEL_SERVICE_NAME Value: "" - Name: OTEL_RESOURCE_ATTRIBUTES Value: "cloud.provider=aws,cloud.platform=aws_ecs,cloud.region=" - Name: OTEL_EXPORTER_OTLP_ENDPOINT Value: "" - Name: OTEL_EXPORTER_OTLP_PROTOCOL Value: "http/protobuf" - Name: OTEL_TRACES_EXPORTER Value: "otlp" - Name: OTEL_METRICS_EXPORTER Value: "otlp" - Name: OTEL_LOGS_EXPORTER Value: "otlp" # --- .NET activation: every value below is SET exactly as shown, not appended --- - Name: CORECLR_ENABLE_PROFILING Value: "1" - Name: CORECLR_PROFILER Value: "{918728DD-259F-4A6A-AC2B-B85E1B658318}" - Name: CORECLR_PROFILER_PATH Value: "/var/odigos/dotnet/linux-glibc/OpenTelemetry.AutoInstrumentation.Native.so" - Name: OTEL_DOTNET_AUTO_HOME Value: "/var/odigos/dotnet" - Name: DOTNET_STARTUP_HOOKS Value: "/var/odigos/dotnet/net/OpenTelemetry.AutoInstrumentation.StartupHook.dll" - Name: DOTNET_ADDITIONAL_DEPS Value: "/var/odigos/dotnet/AdditionalDeps" - Name: DOTNET_SHARED_STORE Value: "/var/odigos/dotnet/store" ``` > [!WARNING] > > The .NET agent is **glibc-only**. A musl-based image (Alpine) can't be > instrumented this way — the profiler shared object won't load, and the > container starts uninstrumented with no error. **PHP** ```yaml theme={null} # Merge into Resources..Properties Volumes: - Name: odigos-agent ContainerDefinitions: - Name: odigos-agent Image: "registry.odigos.io/odigos-fargate-agents:" Essential: false Command: ["sh", "-c", "mkdir -p /var/odigos && cp -r /instrumentations/php /var/odigos/php"] MountPoints: - SourceVolume: odigos-agent ContainerPath: /var/odigos - Name: "" # ... your existing configuration ... MountPoints: - SourceVolume: odigos-agent ContainerPath: /var/odigos ReadOnly: true DependsOn: - ContainerName: odigos-agent Condition: SUCCESS Environment: - Name: ODIGOS_IAC Value: '{"v":1,"lang":"php"}' - Name: OTEL_SERVICE_NAME Value: "" - Name: OTEL_RESOURCE_ATTRIBUTES Value: "cloud.provider=aws,cloud.platform=aws_ecs,cloud.region=" - Name: OTEL_EXPORTER_OTLP_ENDPOINT Value: "" # must be an OTLP/HTTP endpoint — see note below - Name: OTEL_EXPORTER_OTLP_PROTOCOL Value: "http/protobuf" - Name: OTEL_TRACES_EXPORTER Value: "otlp" - Name: OTEL_METRICS_EXPORTER Value: "otlp" - Name: OTEL_LOGS_EXPORTER Value: "otlp" # --- PHP activation --- - Name: PHP_INI_SCAN_DIR Value: ":/var/odigos/php/" # e.g. 8.3 — must match your image's PHP version - Name: OTEL_PHP_AUTOLOAD_ENABLED Value: "true" - Name: OTEL_PROPAGATORS Value: "tracecontext,baggage" ``` > [!WARNING] > > The PHP agent speaks **OTLP/HTTP only** — it cannot use gRPC. Your OTLP > destination must offer an HTTP endpoint (standard port 4318), or PHP services > can't be instrumented at all. `` must match your container's > actual PHP major.minor (e.g. `8.3`) — set a runtime override on the Source so > Odigos judges the container against the path you actually mounted. **Ruby** ```yaml theme={null} # Merge into Resources..Properties Volumes: - Name: odigos-agent ContainerDefinitions: - Name: odigos-agent Image: "registry.odigos.io/odigos-fargate-agents:" Essential: false Command: ["sh", "-c", "mkdir -p /var/odigos && cp -r /instrumentations/ruby /var/odigos/ruby"] MountPoints: - SourceVolume: odigos-agent ContainerPath: /var/odigos - Name: "" # ... your existing configuration ... MountPoints: - SourceVolume: odigos-agent ContainerPath: /var/odigos ReadOnly: true DependsOn: - ContainerName: odigos-agent Condition: SUCCESS Environment: - Name: ODIGOS_IAC Value: '{"v":1,"lang":"ruby"}' - Name: OTEL_SERVICE_NAME Value: "" - Name: OTEL_RESOURCE_ATTRIBUTES Value: "cloud.provider=aws,cloud.platform=aws_ecs,cloud.region=" - Name: OTEL_EXPORTER_OTLP_ENDPOINT Value: "" # must be an OTLP/HTTP endpoint — see note below - Name: OTEL_EXPORTER_OTLP_PROTOCOL Value: "http/protobuf" - Name: OTEL_TRACES_EXPORTER Value: "otlp" - Name: OTEL_METRICS_EXPORTER Value: "otlp" - Name: OTEL_LOGS_EXPORTER Value: "otlp" # --- Ruby activation: RUBYOPT is SET, replacing anything already there --- - Name: RUBYOPT Value: "-r/var/odigos/ruby//index.rb" # e.g. 3.3 - Name: ODIGOS_GEM_PATH Value: "/var/odigos/ruby//bundle" - Name: OTEL_PROPAGATORS Value: "tracecontext,baggage" ``` > [!WARNING] > > The Ruby agent speaks **OTLP/HTTP only** — it cannot use gRPC. Your OTLP > destination must offer an HTTP endpoint (standard port 4318). `` > must match your container's actual Ruby major.minor (e.g. `3.3`); set a runtime > override on the Source so Odigos judges the container against the path you > actually mounted. ### Rules that apply to every language > **ODIGOS\_IAC is per container** > > It's the only thing marking a container as instrumented, and its recorded language is what the > activation environment is checked against. Never set `ODIGOS_MANAGED` — that's the connector's own > rollback record, written only when you hand the workload to Odigos-managed instrumentation instead. > **Endpoint and protocol are one decision** > > Both are compared exactly against what your OTLP destination resolves to on this connector. If it only > offers OTLP/gRPC, use the gRPC endpoint (standard port 4317) and `OTEL_EXPORTER_OTLP_PROTOCOL=grpc` > instead of the `http/protobuf` shown above (except PHP and Ruby, which support HTTP only — see their > tabs). Pairing an endpoint with the wrong transport fails at runtime as an opaque connection reset. > **One odigos-agent container serves the whole task** > > Its `Command` is per task, not per language. A task definition with application containers in more than > one language needs a chained `&& cp -r /instrumentations/ /var/odigos/` for each, in > alphabetical order — Odigos compares the command exactly against the union of every marked container's > language. > **Roll the service, not just the revision** > > Registering a new task-definition revision isn't enough on its own — update the service to it, or it > keeps running the old one. > **Constraints** > > A 10-container task-definition limit, Linux-only agents bundle (no Windows tasks), and the > `odigos-agent` container must stay non-essential — ECS only accepts a `SUCCESS` dependency against a > non-essential container. > **Registry reachability** > > The image is pulled by the task's execution role at every task start. If your task's subnet can't reach > `registry.odigos.io`, mirror the image into a registry it can — see > [Preload artifacts](/cloud-connectors/aws/workloads/fargate/preload). ## Next steps > **[Preload artifacts](/cloud-connectors/aws/workloads/fargate/preload)** > > Mirror the Fargate agents image into a private registry. > **[CDK: Fargate](/cloud-connectors/aws/cdk/fargate)** > > Every option on the Fargate CDK construct, in depth. # Preload the Fargate Agents Image Source: https://docs.odigos.io/cloud-connectors/aws/workloads/fargate/preload Mirror the Fargate agents image into a private registry instead of pulling it from the Odigos registry. Every instrumented Fargate task pulls the same agents bundle at task-start time — it isn't baked into your task image, so the pull happens on every new task launch, and a failed pull blocks the whole task (the application container waits on the stager with a `SUCCESS` dependency). Most accounts need none of this — with Odigos-managed instrumentation, the connector pulls the image from Odigos' own registry on your behalf. Preloading matters if your Fargate tasks run in a network that cannot reach that public registry, or your organization requires every image your tasks pull to live in a registry you own. **Odigos registry (default)** By default, tasks pull `registry.odigos.io/odigos-fargate-agents:` — a public, multi-arch (amd64 + arm64/Graviton) image. This needs egress from the task's subnet to the public internet (a public IP, or NAT). Nothing to configure — this is what Odigos-managed instrumentation uses, and it's also the default a self-managed CloudFormation task definition references unless you override it. **Your own private registry** Mirror the image into a registry your task's execution role can already reach. For example, a private ECR repository in the same account: **1. Create a repository** ```bash theme={null} aws ecr create-repository --repository-name odigos-fargate-agents --region ``` **2. Authenticate Docker to your ECR registry** ```bash theme={null} aws ecr get-login-password --region \ | docker login --username AWS --password-stdin .dkr.ecr..amazonaws.com ``` **3. Copy the image, preserving the multi-arch manifest** Use `docker buildx imagetools create` rather than `pull` + `push` — a plain pull only fetches the image for your local machine's architecture, and pushing that back would give Graviton (arm64) Fargate tasks an amd64 image that fails to start. ```bash theme={null} docker buildx imagetools create \ --tag .dkr.ecr..amazonaws.com/odigos-fargate-agents: \ registry.odigos.io/odigos-fargate-agents: ``` > [!TIP] > > Pin `` to a specific released tag rather than mirroring on a > schedule — an unpinned mirror can drift from what the connector expects > if Odigos ships a newer bundle later. **4. Point instrumentation at your mirrored image** **CloudFormation** Replace the `Image` on the `odigos-agent` container in your task definition with your mirrored tag — see [Instrument Fargate](/cloud-connectors/aws/workloads/fargate/instrument). **CDK** Pass your mirrored tag as `agentsImage` on the construct: ```typescript theme={null} new OdigosFargateInstrumentation(this, 'Odigos', { destination: { httpEndpoint: 'https://otlp.example.com:4318' }, agentsImage: '.dkr.ecr..amazonaws.com/odigos-fargate-agents:', }); ``` See [CDK reference: Fargate](/cloud-connectors/aws/cdk/fargate#the-agents-image). **Odigos-managed** The connector's default Fargate agents image is controlled by the `connector-runtime` controller (`CONNECTOR_AWS_FARGATE_AGENTS_IMAGE`), which stamps `ODIGOS_FARGATE_AGENTS_IMAGE` onto every AWS connector pod it creates. This isn't yet a `values.yaml` setting — set it on the controller directly: ```bash theme={null} kubectl set env deployment/connector-runtime -n odigos-central \ CONNECTOR_AWS_FARGATE_AGENTS_IMAGE=.dkr.ecr..amazonaws.com/odigos-fargate-agents: ``` > [!WARNING] > > This overrides the Fargate agents bundle for **every** AWS connector the > controller manages. Confirm the version and IAM access (the task > execution role needs `ecr:GetDownloadUrlForLayer` / `ecr:BatchGetImage` > on the repository) with Odigos support before changing this in > production — a mismatched or unreachable override affects every > Fargate service across every AWS connector at once. ## Next steps > **[Instrument Fargate](/cloud-connectors/aws/workloads/fargate/instrument)** > > CDK and CloudFormation for every supported Fargate language. # Instrument Lambda with CDK or CloudFormation Source: https://docs.odigos.io/cloud-connectors/aws/workloads/lambda/instrument Self-managed AWS Lambda instrumentation for Java, Python, Node.js, and Ruby using the Odigos CDK construct or hand-written CloudFormation. AWS Lambda functions can be instrumented two ways: **Odigos-managed**, where the connector attaches everything for you, or **self-managed**, where you attach it yourself through your own IaC. This page is about the self-managed path — see [Odigos-managed vs. self-managed instrumentation](/cloud-connectors/overview#odigos-managed-vs-self-managed-instrumentation) if you haven't decided which one you want yet. > [!NOTE] > > Terraform and a plain `aws lambda update-function-configuration` CLI command are > also available for every language shown here — the **Custom** access-level policy > preview in the Central UI surfaces all four formats for a discovered function. > This page covers the two most common: CDK and CloudFormation. ## What actually gets added to your function However you apply it, self-managed Lambda instrumentation is the same four things: 1. **The OpenTelemetry layer** — a prebuilt Lambda layer for your function's language and architecture. 2. **An exec wrapper** (`AWS_LAMBDA_EXEC_WRAPPER`) — tells Lambda to run your handler through the layer's instrumentation code first. The exact path is different per language. 3. **The bundled collector's configuration** (`OPENTELEMETRY_COLLECTOR_CONFIG_URI`) — tells the small OpenTelemetry collector that ships inside the layer where to send your telemetry. It runs in the same Lambda sandbox and forwards data *after* your handler already returned, so a slow destination costs extra billed time, not extra response latency. 4. **The `ODIGOS_IAC` marker** — a small JSON value that tells Odigos "this function is instrumented, and here's the layer version it's running." Without it, Odigos has no way to tell the difference between an instrumented function and one you haven't touched yet — it will keep reporting the function as **Not Instrumented / Waiting for you**, even if everything else above is already in place. The CDK construct sets all four for you. With CloudFormation, you set them by hand — one per-language tab below shows exactly what to add. ## Using AWS CDK The easiest option if your functions are already defined in a CDK app. One package covers every supported language — the construct looks at each function's runtime and figures out the right layer and wrapper on its own. ```bash theme={null} npm install @odigos/aws-cdk@ ``` > [!NOTE] > > TypeScript and JavaScript only, for now — a Python distribution is built but not > yet published. Python CDK apps should use the > [CloudFormation instructions](#using-cloudformation-directly) below. ```typescript theme={null} import { OdigosLambdaInstrumentation } from '@odigos/aws-cdk'; new OdigosLambdaInstrumentation(this, 'Odigos', { destination: { endpoint: 'otlp.example.com:4317', // OTLP/gRPC as bare host:port — no scheme // httpEndpoint: 'https://otlp.example.com:4318', // use this instead, for OTLP/HTTP }, serviceName: 'my-api', // set explicitly if your stack doesn't name the function directly functions: [apiFn, workerFn], }); ``` That's it — this one call attaches the layer, sets the wrapper, configures the bundled collector (using the same renderer the connector itself uses, so the values match exactly), and writes `ODIGOS_IAC` for every function you list. > [!WARNING] > > Don't also enable a CDK-instrumented function as an Odigos-managed source. Every > `cdk deploy` would reassert the CDK's configuration, every connector reconcile > would reassert its own, and you'd get a new function version on every round trip. > **[Full CDK reference](/cloud-connectors/aws/cdk/lambda)** > > Every option in depth — layer sources, instrumenting a whole stack at once, the AWS Lambda Web Adapter, > Java handler interfaces, and the complete API. ## Using CloudFormation directly If you're not using CDK, merge these properties into your function's `AWS::Lambda::Function` resource by hand. The shape is identical across languages — a layer, a wrapper, a service name, and the collector configuration — but the wrapper path (and, for the Web Adapter case, the loader variable) is different for each one. Pick your language below: **Java** ```yaml theme={null} # Merge into Resources..Properties Layers: - "" # keep any layers you already have, add this one Environment: Variables: ODIGOS_IAC: '{"v":1,"layer":""}' AWS_LAMBDA_EXEC_WRAPPER: "/opt/otel-handler" OTEL_SERVICE_NAME: "" OPENTELEMETRY_COLLECTOR_CONFIG_URI: 'yaml:{receivers: {otlp: {protocols: {grpc: {endpoint: "localhost:4317"}, http: {endpoint: "localhost:4318"}}}}, processors: {memory_limiter: {check_interval: 1s, limit_percentage: 50, spike_limit_percentage: 20}, batch: {send_batch_size: 512, timeout: 200ms}, decouple: null}, exporters: {otlp: {endpoint: "", tls: {insecure: }}}, service: {telemetry: {metrics: {level: none}}, pipelines: {traces: {receivers: [otlp], processors: [memory_limiter, batch, decouple], exporters: [otlp]}}}}' ``` > [!NOTE] > > Java ships three more wrappers for handler interfaces other than the default > `RequestHandler`: `/opt/otel-proxy-handler` (API Gateway proxy events), > `/opt/otel-sqs-handler` (SQS), and `/opt/otel-stream-handler` > (`RequestStreamHandler`). Using the default wrapper on a `RequestStreamHandler` > function breaks the invocation — it's the wrong interface, not just a > less-detailed trace. **Running behind the AWS Lambda Web Adapter?** Remove `AWS_LAMBDA_EXEC_WRAPPER` — the adapter already owns it — and instead append the agent to `JAVA_TOOL_OPTIONS`. CloudFormation can't read an existing environment variable back, so add your current value in by hand: ```yaml theme={null} JAVA_TOOL_OPTIONS: " -javaagent:/opt/opentelemetry-javaagent.jar" ``` **Python** ```yaml theme={null} # Merge into Resources..Properties Layers: - "" Environment: Variables: ODIGOS_IAC: '{"v":1,"layer":""}' AWS_LAMBDA_EXEC_WRAPPER: "/opt/otel-instrument" OTEL_SERVICE_NAME: "" OPENTELEMETRY_COLLECTOR_CONFIG_URI: 'yaml:{receivers: {otlp: {protocols: {grpc: {endpoint: "localhost:4317"}, http: {endpoint: "localhost:4318"}}}}, processors: {memory_limiter: {check_interval: 1s, limit_percentage: 50, spike_limit_percentage: 20}, batch: {send_batch_size: 512, timeout: 200ms}, decouple: null}, exporters: {otlp: {endpoint: "", tls: {insecure: }}}, service: {telemetry: {metrics: {level: none}}, pipelines: {traces: {receivers: [otlp], processors: [memory_limiter, batch, decouple], exporters: [otlp]}}}}' ``` **Running behind the AWS Lambda Web Adapter?** Remove `AWS_LAMBDA_EXEC_WRAPPER` and load the agent through `PYTHONPATH` instead. Unlike Java or Node.js, this value goes at the **front**, not the back — the layer's OpenTelemetry packages need to resolve before your application's own code does: ```yaml theme={null} PYTHONPATH: "/opt/python:/opt/python/opentelemetry/instrumentation/auto_instrumentation:/var/task:/var/task/site-packages:" OTEL_EXPORTER_OTLP_PROTOCOL: "http/protobuf" ``` **Node.js** ```yaml theme={null} # Merge into Resources..Properties Layers: - "" Environment: Variables: ODIGOS_IAC: '{"v":1,"layer":""}' AWS_LAMBDA_EXEC_WRAPPER: "/opt/otel-handler" OTEL_SERVICE_NAME: "" OPENTELEMETRY_COLLECTOR_CONFIG_URI: 'yaml:{receivers: {otlp: {protocols: {grpc: {endpoint: "localhost:4317"}, http: {endpoint: "localhost:4318"}}}}, processors: {memory_limiter: {check_interval: 1s, limit_percentage: 50, spike_limit_percentage: 20}, batch: {send_batch_size: 512, timeout: 200ms}, decouple: null}, exporters: {otlp: {endpoint: "", tls: {insecure: }}}, service: {telemetry: {metrics: {level: none}}, pipelines: {traces: {receivers: [otlp], processors: [memory_limiter, batch, decouple], exporters: [otlp]}}}}' ``` **Running behind the AWS Lambda Web Adapter?** Remove `AWS_LAMBDA_EXEC_WRAPPER` and append the agent to `NODE_OPTIONS` instead: ```yaml theme={null} NODE_OPTIONS: " --import /opt/init.mjs" ``` **Ruby** ```yaml theme={null} # Merge into Resources..Properties Layers: - "" Environment: Variables: ODIGOS_IAC: '{"v":1,"layer":""}' AWS_LAMBDA_EXEC_WRAPPER: "/opt/otel-handler" OTEL_SERVICE_NAME: "" OPENTELEMETRY_COLLECTOR_CONFIG_URI: 'yaml:{receivers: {otlp: {protocols: {grpc: {endpoint: "localhost:4317"}, http: {endpoint: "localhost:4318"}}}}, processors: {memory_limiter: {check_interval: 1s, limit_percentage: 50, spike_limit_percentage: 20}, batch: {send_batch_size: 512, timeout: 200ms}, decouple: null}, exporters: {otlp: {endpoint: "", tls: {insecure: }}}, service: {telemetry: {metrics: {level: none}}, pipelines: {traces: {receivers: [otlp], processors: [memory_limiter, batch, decouple], exporters: [otlp]}}}}' ``` > [!NOTE] > > Ruby doesn't have a web-server (AWS Lambda Web Adapter) activation path — the > exec wrapper above is the only way to instrument it. If you apply this to a > Ruby function that actually runs behind the adapter, it won't work, and it > will show up as instrumentation drift rather than a clear error. > [!TIP] > > Substitute only the placeholders in ``. Change nothing else in > `OPENTELEMETRY_COLLECTOR_CONFIG_URI` — Odigos compares the whole value as one > string, and even a missing space after a colon breaks it (see below). ## Things to watch out for > **Every space in the collector config matters** > > `OPENTELEMETRY_COLLECTOR_CONFIG_URI` is written in a compact YAML style where a colon must always be > followed by a space. Miss one and the collector doesn't fail with a helpful parse error — it accepts > the variable, logs the URI it read, and then fails to start with an unrelated-looking > `otelcol state is Closed`. > **A few variables must never be set** > > `OTEL_EXPORTER_OTLP_ENDPOINT`, `OTEL_EXPORTER_OTLP_HEADERS`, `ODIGOS_OTLP_ENDPOINT`, and > `ODIGOS_OTLP_INSECURE` are all compared against **unset** — adding any of them is reported as drift, > even if the value looks harmless. `OTEL_LOG_LEVEL` is the one exception: leave it unset unless debug > telemetry is turned on for this connector, in which case it must be exactly `debug`. > **ODIGOS\_IAC is not optional** > > It's the only signal Odigos has that this function is instrumented at all, and the layer ARN recorded > inside it is what future checks compare against — so a version you deliberately pinned is respected > instead of being flagged as an available upgrade. > **Never set ODIGOS\_MANAGED by hand** > > That variable belongs to the connector alone — it's how the connector remembers what to roll back to > after it makes a change itself. Setting it yourself claims a rollback that was never actually recorded. > **Turning off a signal** > > If your destination doesn't accept metrics or logs, set `OTEL_METRICS_EXPORTER` / `OTEL_LOGS_EXPORTER` > to `"none"` and remove that signal's pipeline from the collector configuration. Leave both untouched > (unset) for a signal your destination does accept. > [!TIP] > > Once `ODIGOS_IAC` is set and the layer, wrapper, and collector configuration all > match, Odigos flips the function to **Instrumented** on its own — usually within > a few minutes, at the next discovery cycle. No action needed on the Odigos side. ## Next steps > **[Full CDK reference](/cloud-connectors/aws/cdk/lambda)** > > Every construct option, in depth. > **[Preload the layer](/cloud-connectors/aws/workloads/lambda/preload)** > > Get the layer into your own account first, if your policy requires it. # Preload the Lambda Layer Source: https://docs.odigos.io/cloud-connectors/aws/workloads/lambda/preload Preload the Lambda OpenTelemetry layer into your own AWS account before instrumenting with IaC. > [!NOTE] > > If you use **Odigos-managed** Lambda instrumentation, you can skip this page — the > connector publishes the layer version into your account itself > (`lambda:PublishLayerVersion`) the first time it instruments a function. Nothing to > preload. If you **self-manage** instrumentation, you have two choices for where the layer your CloudFormation, CDK, or Terraform attaches actually lives: **Reference the public Odigos layer** Simplest option: attach the public layer ARN Odigos publishes in every region (`arn:aws:lambda:::layer:odigos-otel--:`) directly in your function resource. No preloading, no extra deploy — for next steps see [Instrument Lambda](/cloud-connectors/aws/workloads/lambda/instrument). If your organization's policy forbids attaching a Lambda layer owned by another AWS account, use the **Preload into your own account (SAR)** tab instead. **Preload into your own account (SAR)** Deploy the Odigos layer from the AWS Serverless Application Repository (SAR) so the resulting `AWS::Lambda::LayerVersion` is owned by **your** account. Then attach that stack's `LayerVersionArn` instead of the public Odigos layer ARN. Deploying a SAR application is an AWS workflow — follow [Deploying applications](https://docs.aws.amazon.com/serverlessrepo/latest/devguide/serverlessrepo-how-to-consume.html) (Console or CLI). For nesting the app in your own template, see [`AWS::Serverless::Application`](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-application.html). What Odigos supplies for that deploy: * **Application IDs** — `SAR_APPLICATIONS` in `@odigos/aws-cdk`, keyed by `language/architecture` (for example `python/arm64`). Search the console for `odigos-otel--` if you prefer. * **Semantic version** — `SAR_SEMANTIC_VERSION` in the same package. Pin it; SAR versions are immutable and that pin keeps the layer bytes stable across deploys. With the Odigos CDK construct, you do not call SAR yourself — set `layerSource: OdigosLayerSource.IN_ACCOUNT` and the construct nests the application using those exports. See [Where the layer comes from](/cloud-connectors/aws/cdk/lambda#where-the-layer-comes-from). The deploying principal needs `serverlessrepo:CreateCloudFormationTemplate` and `serverlessrepo:GetApplication`. > [!NOTE] > > Layer versions are retained, never deleted, when a stack update supersedes them > — a function still pinned to an older version would break at cold start the > moment it disappeared. Clean up old versions yourself once nothing references > them. ## Next steps > **[Instrument Lambda](/cloud-connectors/aws/workloads/lambda/instrument)** > > CDK and CloudFormation for every supported Lambda language. > **[CDK reference](/cloud-connectors/aws/cdk/lambda)** > > Every option on the Lambda CDK construct, in depth. # Enable Cloud Connectors Source: https://docs.odigos.io/cloud-connectors/enable Enable the Cloud Connectors feature on Odigos Central with Helm or the CLI, including bundled PostgreSQL configuration. Cloud Connectors are **off by default**. Until you enable them, Central does not install the connector controller, the connector PostgreSQL store, or the `OdigosCloudConnector` CRD. Enabling the feature does **not** create per-account connectors. After the subsystem is running, add an [AWS](/cloud-connectors/add-connectors/add-aws-connector) or [GCP](/cloud-connectors/add-connectors/add-gcp-connector) connector from the Central UI. > [!NOTE] > > Cloud Connectors require the same Odigos Enterprise on-prem token (or install > secret) as the rest of the Central installation. ## What gets installed When `cloudConnectors.enabled` is `true` and the Central install secret exists, the chart installs: * The `OdigosCloudConnector` CRD * The `connector-runtime` controller * Bundled PostgreSQL (`odigos-connector-postgres`) and a PVC when persistence is enabled > [!WARNING] > > A **StorageClass** must be defined for the Postgres PVC. Bundled Postgres > uses a PVC for connector state management; without a usable StorageClass the > PVC cannot bind. Set > `cloudConnectors.postgres.persistence.storageClassName` explicitly, or leave > it empty to use the cluster default. ## Enable Cloud Connectors **CLI** At install time: ```bash theme={null} odigos pro central install \ --set onPremToken= \ --set cloudConnectors.enabled=true \ --set cloudConnectors.postgres.password= \ --set cloudConnectors.postgres.persistence.enabled=true \ --set cloudConnectors.postgres.persistence.size=20Gi \ --set cloudConnectors.postgres.persistence.storageClassName= ``` On an existing Central installation: ```bash theme={null} odigos pro central upgrade \ --set cloudConnectors.enabled=true \ --set cloudConnectors.postgres.password= \ --set cloudConnectors.postgres.persistence.enabled=true \ --set cloudConnectors.postgres.persistence.size=20Gi \ --set cloudConnectors.postgres.persistence.storageClassName= ``` > [!TIP] > > Leave `storageClassName` empty to use the cluster default, or set it to a > class your cluster requires (e.g. `gp3`). **Helm** Enable with `--set`: ```bash theme={null} helm upgrade --install odigos-central odigos/odigos-central \ --namespace odigos-central \ --reuse-values \ --set cloudConnectors.enabled=true \ --set cloudConnectors.postgres.password= \ --set cloudConnectors.postgres.persistence.enabled=true \ --set cloudConnectors.postgres.persistence.size=20Gi \ --set cloudConnectors.postgres.persistence.storageClassName= ``` Or in `values.yaml`: ```yaml theme={null} cloudConnectors: enabled: true postgres: password: "" persistence: enabled: true size: 20Gi storageClassName: "" # set if your cluster requires an explicit class ``` Then apply: ```bash theme={null} helm upgrade --install odigos-central odigos/odigos-central \ --namespace odigos-central \ --create-namespace \ -f values.yaml ``` ## PostgreSQL configuration Cloud Connectors use a bundled PostgreSQL instance under `cloudConnectors.postgres`. Configure these values when you enable the feature: **cloudConnectors.postgres.password** `string` (default: odigos) Database password. Change this for non-development installs. **cloudConnectors.postgres.username** `string` (default: odigos) Database username. **cloudConnectors.postgres.database** `string` (default: odigos\_central) Database name. **cloudConnectors.postgres.persistence.enabled** `boolean` (default: true) Persist connector state on a PVC. **cloudConnectors.postgres.persistence.size** `string` (default: 20Gi) PVC size. Your cluster must provide storage. **cloudConnectors.postgres.persistence.storageClassName** `string` Storage class. Empty uses the cluster default. > **Advanced Postgres settings** > > | Value | Default | Description | > | - | - | - | > | `postgres.persistence.accessModes` | `[ReadWriteOnce]` | PVC access modes | > | `postgres.resources` | chart defaults | CPU and memory requests/limits for the Postgres pod | > | `postgres.image` | chart default | Leave at the chart default unless Odigos support or engineering asks you to override it | > > > [!WARNING] > > > > Do not set a custom Postgres image on your own. Use the image shipped with > > the chart unless Odigos support or engineering directs otherwise. > **Optional provider image overrides** > > Provider connector images (`cloudConnectors.aws.image`, `cloudConnectors.gcp.image`) default to the versions shipped with the chart. > > > [!WARNING] > > > > Override these only when Odigos support or engineering asks you to. Custom > > images can break discovery, instrumentation, or schema compatibility. > > ```yaml theme={null} > cloudConnectors: > enabled: true > aws: > image: "" # empty = chart default; set only if directed by Odigos > gcp: > image: "" # empty = chart default; set only if directed by Odigos > ``` ## Verify After enablement, confirm the subsystem is running in the Central namespace (default `odigos-central`): ```bash theme={null} kubectl get pods -n odigos-central -l 'app in (connector-runtime,odigos-connector-postgres)' ``` You should see `connector-runtime` and `odigos-connector-postgres` in a Running state. > [!TIP] > > Once both pods are Running, you are ready to add a cloud provider connector. ## Next steps > **[Add AWS connector](/cloud-connectors/add-connectors/add-aws-connector)** > > Connect an AWS account. > **[Add GCP connector](/cloud-connectors/add-connectors/add-gcp-connector)** > > Connect a Google Cloud project. > **[Instrument workloads](/cloud-connectors/instrument-workloads)** > > Create Sources after a connector is online. # Instrument Cloud Workloads Source: https://docs.odigos.io/cloud-connectors/instrument-workloads Create Sources from discovered cloud workloads, configure an OTLP destination, and track instrumentation progress. Once a Cloud Connector is online, browse the workloads it discovered and create **Sources** for the ones you want to observe. Enabling a Source tells the connector to apply provider-specific instrumentation and export telemetry to the OTLP destination(s) on that connector. ## Prerequisites **1. Healthy connector** A Cloud Connector with discovery enabled for the workload types you want. **2. OTLP destination** At least one **OTLP destination** on that connector. See [Add an OTLP destination](#add-an-otlp-destination). Workload instrumentation is destination-gated; without a usable OTLP endpoint the connector will not attach instrumentation. **3. Reachable endpoint** Instrumented workloads export OTLP to that destination from the cloud environment (for example from Lambda or Cloud Run). Point the destination at an endpoint those workloads can reach — for example a collector or backend with appropriate public or VPC access. See [Telemetry export](/cloud-connectors/overview#telemetry-export). ## Add an OTLP destination Before you create Sources, add at least one destination on the connector so instrumented workloads have somewhere to export telemetry. Lambda and Cloud Run support OTLP destinations only. For more information, see [Telemetry export](/cloud-connectors/overview#telemetry-export). Follow the [Destinations overview](/enterprise/backends-overview) for how to add and configure a destination, then apply that setup on the connector in Central. The endpoint must be reachable from the cloud workloads themselves (not only from the Central cluster). ## Browse discovered workloads Open the connector in Central and review discovered workloads. Each candidate typically includes kind, name, region/location, and whether it is already a Source or instrumented. ## Create Sources Select the workloads to instrument and create Sources. A Source is the instrumentation intent for one cloud resource. Identity includes: * **Name**: the provider resource name * **Kind**: for example `aws.lambda` or `gcp.cloud-run` * **Region**: the resource's region or location Enable the Source so the connector applies instrumentation to that workload. That typically means adding the Odigos OTEL SDK and collector components the runtime needs, configuring them for the workload, and configuring where telemetry is sent (the OTLP destination on the connector). See [Supported languages](/cloud-connectors/overview#supported-languages) for which runtimes each workload type can instrument. ## Check Source status After you create a Source, it appears under **Sources** in Central. Open it to see details and health. The Source details typically include: * **Identity**: kind (e.g. AWS Lambda), name, region, and service name, plus whether the Source is **Enabled** * **Health**: a status banner such as **Success And Emitting Telemetry** when the Source is instrumented, healthy, and telemetry has been observed * **Instrumentation**: detected language and version (e.g. `python • 3.13`), and whether the workload is **Instrumented** If something is wrong (for example missing permissions), use the health message on the Source details to diagnose. ## Uninstrument workloads To remove instrumentation from one or more Sources, select them with the checkboxes and click **Uninstrument**. The connector removes the Odigos OTEL SDK, collector components, and related configuration it applied earlier, so the workloads stop exporting telemetry through that Source. ## Troubleshooting > **No instrumentation applied** > > Confirm an [OTLP destination](#add-an-otlp-destination) exists on the connector and the Source is enabled. See [Destinations overview](/enterprise/backends-overview) for how to add and configure destinations. > **GCP: permission denied on update** > > Grant `iam.serviceAccounts.actAs` (or `roles/iam.serviceAccountUser` on the runtime service account). See [Add GCP connector](/cloud-connectors/add-connectors/add-gcp-connector). > **GCP: traces missing intermittently** > > Cloud Run CPU throttling or scale-to-zero can delay or drop background OTLP export. Prefer a reachable destination and, if needed, keep CPU allocated or a minimum instance warm on low-traffic services. > **AWS: test connection passed but instrumentation fails** > > Test connection validates discovery permissions. Grant the Lambda instrumentation IAM actions listed on the [Add AWS](/cloud-connectors/add-connectors/add-aws-connector) page. ## Next steps > **[Manage and remove](/cloud-connectors/manage-and-remove)** > > Understand connector health and how deletion policies affect cloud instrumentation. # Manage and Remove Cloud Connectors Source: https://docs.odigos.io/cloud-connectors/manage-and-remove Monitor Cloud Connector health, understand status, and remove connectors with retain or cleanup deletion policies. Use this page to operate connectors after they are online — health, immutable fields, and safe removal. ## Connector status The connectors list and detail views show installation and runtime health. The connector phase is one of: | Status | Meaning | | - | - | | **Pending** | The connector resource exists but has not started yet | | **Starting** | The connector workload is deploying, or the runtime has not finished registering, authenticating, and completing a successful discovery cycle | | **Connected** | The runtime is healthy: authenticated to the cloud account and discovery is succeeding | | **Degraded** | The runtime is up but not fully healthy (for example discovery failures, or heartbeats that have gone stale) | | **Error** | A hard failure that blocks a healthy runtime (for example the connector image cannot be resolved, or `spec.provider` was changed after create) | | **Disabled** | The connector runtime reported itself as disabled | | **Deleting** | The connector is being removed (including instrumentation cleanup when the deletion policy is `cleanup`) | > **Common causes of Degraded or Error** > > **Degraded** usually means: > > * A discovery cycle failed (missing permissions, cloud API errors, or other detector failures) > * The runtime stopped refreshing its heartbeat (for example the pod is wedged or lost its Postgres connection), so the last healthy status went stale > > Auth that has not succeeded yet, or discovery that has not completed a successful cycle yet, typically stays in **Starting** rather than **Degraded**. > > **Error** usually means: > > * The connector image could not be resolved for the provider > * `spec.provider` was changed after the connector was created (provider is immutable) > > Schema version mismatches fail connector startup (the pod does not stay healthy), which typically shows as **Starting** or, if heartbeats stop updating, **Degraded** — not a dedicated schema-mismatch phase. > > Fix credentials or IAM, confirm [Cloud Connectors are enabled](/cloud-connectors/enable), and check `connector-runtime` / connector pods in the Central namespace. ## What you can change * You can update display name, credentials Secret contents, discovery interval, and **capabilities** (which types to discover/instrument), depending on what the UI exposes for your version. * **`provider` is immutable** after the connector is created. To switch providers (for example from AWS to another cloud), create a new connector. ## Delete a connector Deleting a connector removes the connector runtime from the Central cluster. What happens to cloud-side instrumentation depends on the deletion policy annotation on the `OdigosCloudConnector` resource: ```yaml theme={null} metadata: annotations: odigos.io/deletion-policy: retain # or cleanup ``` **retain (default)** Deletes the connector from Central (the connector pod and related resources in the Central cluster). It does **not** uninstrument cloud workloads. Any Odigos instrumentation already applied in the cloud account stays in place (for example Lambda layers or Cloud Run agent injection). To remove that instrumentation, [uninstrument Sources](/cloud-connectors/instrument-workloads#uninstrument-workloads) while the connector is still online, or change those resources outside Odigos after delete. > [!NOTE] > > Creating a connector from the Central UI typically leaves the annotation > unset, which means **retain**. **cleanup** Before removing the connector, attempt to roll back Odigos instrumentation in the provider. Set the annotation explicitly: ```yaml theme={null} metadata: annotations: odigos.io/deletion-policy: cleanup ``` > [!WARNING] > > If rollback does not finish within the cleanup timeout (**15 minutes** by > default), the connector may still be deleted and some resources can remain > instrumented. ### Sources on delete When you delete a connector, Sources and discovery data for that account boundary are no longer managed through that connector. > [!TIP] > > Prefer disabling or deleting Sources first if you want a controlled rollback > while the connector is still running, especially under the default **retain** > policy. ## Related > **[Instrument workloads](/cloud-connectors/instrument-workloads)** > > Create and disable Sources while the connector is online. > **[Cloud Connectors overview](/cloud-connectors/overview)** > > Back to concepts and supported providers. # Cloud Connectors Overview Source: https://docs.odigos.io/cloud-connectors/overview Use Odigos Central Cloud Connectors to discover and instrument cloud workloads across supported providers from a single control plane. Cloud Connectors are the third connection type in Odigos Central, alongside [Remote Clusters](/central/adding-connections/remote-clusters) and [VM Agent](/central/adding-connections/vmagent). Each connector manages **one** cloud account boundary (for example an AWS account, a GCP project, or another supported provider). From Central you discover workloads in that account, create Sources for the ones you want to observe, and track instrumentation progress. ## Prerequisites **1. Install Odigos Central** Follow the [Central installation](/central/installation) guide. **2. Enable Cloud Connectors** Set `cloudConnectors.enabled=true`. See [Enable Cloud Connectors](/cloud-connectors/enable). **3. Prepare cloud access** Create a cloud identity (e.g. IAM role or service account) with only the permissions you want the connector to have. See [You control the access scope](#you-control-the-access-scope). ## Why use Cloud Connectors? * **Unified management** — Manage serverless and cloud workloads alongside Kubernetes clusters and VM hosts from the same Central UI * **Automatic discovery** — Surface instrumentable workloads in the account boundary without hunting for each resource by hand * **Flexible scale** — Instrument one workload or many at once from discovery; nothing is instrumented until you choose * **Less operational overhead** — Avoid manually attaching layers, agents, or env vars on every Lambda or Cloud Run service * **Centralized credentials** — Cloud credentials live as Secrets in the Central cluster; one connector owns one account boundary for clear blast radius and ownership ## You control the access scope Cloud Connectors do **not** get blanket access to your cloud environment. What each connector can discover and instrument is limited by the access you grant. > [!NOTE] > > Scope is defined by your cloud permissions (e.g. IAM policies or service account > roles), plus the resource types you enable on the connector. Odigos only acts > within that boundary. Three layers work together: 1. **Cloud credentials and permissions** — The role or service account you attach decides which APIs and resources the connector can call. Narrow policies mean a narrower discovery and instrumentation footprint. 2. **Connector capabilities** — When you add a connector, you choose which resource types may be discovered and which may be instrumented (per-type capabilities). 3. **Sources** — Even after discovery, nothing is instrumented until you create Sources for the workloads you select. Provider-specific permission lists are covered on the corresponding Add connector pages (for example [Add AWS](/cloud-connectors/add-connectors/add-aws-connector)). ## Workloads and compute platforms Connectors organize resources into two domains: * **Workloads** — resources Odigos discovers and can instrument directly (for example AWS Lambda or GCP Cloud Run). * **Compute platforms** — managed environments such as ECS clusters, GKE, or Compute Engine. These can be discovered today; installing a separate Odigos agent onto them expands coverage over time. You choose which resource types to discover and instrument when you add a connector (per-type capabilities). ## Odigos-managed vs. self-managed instrumentation When adding or editing a connector, choose an instrumentation method for each workload type: | Discovery | Instrumentation | Mode | Who applies the change | | - | - | - | - | | On | On | **Odigos-managed (automatic)** | Odigos attaches instrumentation for you (a Lambda layer + environment, or a sidecar injected into an ECS task definition) and keeps it in place on every reconcile cycle. | | On | Off | **Self-managed (IaC)** | You apply the change yourself — CloudFormation, CDK, Terraform, or by hand. Odigos only discovers and reports status; it never modifies the resource. | | Off | — | Not discovered | The type is not surfaced at all. | Rather than using a dedicated mode toggle, Odigos controls access through per-type instrumentation settings. This ensures self-managed workloads are safe by default—Odigos cannot touch or configure a resource unless its instrumentation capability is active. > [!TIP] > > Pick self-managed when your organization already provisions Lambda functions or ECS > task definitions through CloudFormation, CDK, or Terraform and you want that > pipeline to stay the source of truth. Pick Odigos-managed when you want instrumentation > applied and kept up to date without changing your IaC. A self-managed workload shows as **Not Instrumented / Waiting for you** until Odigos observes that you've applied its instrumentation, then it flips to **Instrumented** on its own — there is nothing to click on the Odigos side. If a self-managed workload is later disabled as a Source or its Source is deleted while your instrumentation is still applied, it reports an error rather than silently going dark — Odigos never removes instrumentation it did not apply, so taking it back out is yours to do. > [!WARNING] > > Instrument a given workload **one way, not both**. A function or service you > instrument yourself and also enable as an Odigos-managed Source is owned by > both sides — every IaC deploy reasserts your configuration, every Odigos > reconcile reasserts its own, and you get a new function version or task > revision on every round trip. For AWS specifically, see [AWS Connector](/cloud-connectors/aws/overview) for how to instrument Lambda and Fargate yourself with CloudFormation or CDK, and how to preload artifacts into your own account first. ## Resource coverage Current coverage includes the following providers and resource types. Additional providers may be added over time. | Provider | Discover | Instrument | | - | - | - | | AWS Lambda (`aws.lambda`) | Yes | Yes — Odigos-managed or self-managed | | Amazon ECS Fargate tasks (`aws.fargate-task`) | Yes | Yes — Odigos-managed or self-managed | | Amazon ECS clusters (`aws.ecs-cluster`, `aws.fargate-cluster`) | Yes | n/a (coverage/grouping only; agent install coming soon) | | GCP Cloud Run (`gcp.cloud-run`) | Yes | Yes | | GKE (`gcp.gke`) / Compute Engine (`gcp.gce`) | Yes | Coming soon | ## Supported languages Direct instrumentation depends on the workload type: | Workload | Supported languages | | - | - | | AWS Lambda (`aws.lambda`) | Java, Python, Node.js, Ruby | | Amazon ECS Fargate tasks (`aws.fargate-task`) | Java, Python, Node.js, .NET, PHP, Ruby | | GCP Cloud Run (`gcp.cloud-run`) | Java, Python, Node.js, .NET | Other Lambda runtimes (for example Go or .NET) can still be discovered; they are not instrumented until support for those runtimes is added. On Fargate, Go and any other eBPF-based language cannot be instrumented at all — Fargate does not allow the privileged containers eBPF needs — and a task with no other instrumentable container is reported unsupported. AWS Lambda Ruby, and Fargate PHP and Ruby, support OTLP HTTP only. See [Telemetry export](#telemetry-export) for destination protocol limits. ## Telemetry export Instrumented workloads export OpenTelemetry data to an **OTLP endpoint** you configure on the connector. That endpoint must be reachable from the cloud environment (for example from Lambda or Cloud Run). Lambda, Fargate, and Cloud Run support **OTLP destinations only**. Fargate tasks export **directly** to the destination — there is no node-local collector on ECS the way there is inside the Lambda layer, so the destination endpoint must be reachable from the task's VPC. Protocol support for AWS Lambda: * **Python, Node.js, Java** — OTLP gRPC and OTLP HTTP * **Ruby** — OTLP HTTP only Protocol support for Amazon ECS Fargate: * **Java, Python, Node.js, .NET** — prefer OTLP HTTP but honor OTLP gRPC if that's all the destination offers * **PHP, Ruby** — OTLP HTTP only; without an OTLP HTTP endpoint on the destination these languages cannot be instrumented at all GCP Cloud Run supports OTLP gRPC and OTLP HTTP. See [Add an OTLP destination](/cloud-connectors/instrument-workloads#add-an-otlp-destination). For how to add and configure destinations, see the [Destinations overview](/enterprise/backends-overview). ## Next steps > **[Enable Cloud Connectors](/cloud-connectors/enable)** > > Turn on the feature in Helm or the CLI, including Postgres settings. > **[Add AWS connector](/cloud-connectors/add-connectors/add-aws-connector)** > > Connect an AWS account and discover Lambda and ECS resources. > **[Add GCP connector](/cloud-connectors/add-connectors/add-gcp-connector)** > > Connect a Google Cloud project and discover Cloud Run services. > **[Instrument workloads](/cloud-connectors/instrument-workloads)** > > Create Sources and track instrumentation after a connector is online. > **[AWS Connector](/cloud-connectors/aws/overview)** > > Full AWS connector reference: flows, artifact preloading, and CDK/CloudFormation for every instrumentation type. # Adding New Observability Destination Source: https://docs.odigos.io/enterprise/adding-new-dest There are tens if not hundreds of different observability destinations. Odigos's goal is to provide a seamless and easy way to ship observability data to any one of them. In this guide, you will learn how to contribute a new destination to Odigos. We will create a new dummy destination called `mydest`. Creating a new destination involves these steps: 1. Extending the UI for the new destination 2. Adding the collector configuration for the new destination 3. Generating the documentation for the new destination ### User Interface For our new destination to be visible in the UI, we need to define the destination metadata and fields in YAML format: **1. Add Logo** Go to [`destinations/logos/`](https://github.com/odigos-io/odigos/tree/main/destinations/logos) directory and add your logo. * Must be in SVG format * Example: `mydest.svg` ```svg mydest.svg theme={null} My Destination ``` **2. Add Destination Metadata** Go to [`destinations/data/`](https://github.com/odigos-io/odigos/tree/main/destinations/data) directory and create a new YAML file. * Example: `mydest.yaml` > **Allowed properties** > > | Key | Example | Required | Description | Docs | > | - | - | :-: | - | :-: | > | metadata.type | `mydest` | ✅ | unique identifier for the destination | ✅ | > | metadata.displayName | `My Destination` | ✅ | display name of the destination | ✅ | > | metadata.category | `managed` | ✅ | one-of: `managed` `self hosted` | ✅ | > | spec.image | `mydest.svg` | ✅ | logo of the destination | ✅ | > | spec.signals.traces.supported | `true` | ✅ | is tracing supported? | ✅ | > | spec.signals.metrics.supported | `true` | ✅ | is metrics supported? | ✅ | > | spec.signals.logs.supported | `false` | ✅ | is logging supported? | ✅ | > | spec.note.type | `Note` | ❌ | type of [callout box](https://mintlify.com/docs/content/components/callouts) to display one-of: `Note` `Info` `Warning` `Tip` `Check` | ✅ | > | spec.note.content | `We handle the endpoint internally, so you don't need to provide it.` | ❌ | content of the callout box | ✅ | > | spec.fields | - | ✅ | list of fields to be configured, [see specification here](#allowed-properties-for-spec-fields) | ✅ | > **Allowed properties for spec.fields\[]** > > | Key | Example | Required | Description | Docs | > | - | - | :-: | - | :-: | > | name | `MYDEST_API_KEY` | ✅ | key name of the field | ✅ | > | displayName | `API Key` | ✅ | display name of the field | ✅ | > | secret | `true` | ❌ | is the field a secret? (e.g. password, token, etc.) | ❌ | > | initialValue | - | ❌ | default value for the field | ✅ | > | componentType | `input` | ✅ | one-of: `input` `textarea` `dropdown` `checkbox` `multiInput` `keyValuePairs` | ✅ | > | componentProps.type | `password` | ❌ | the type of value (e.g. string, number, password, etc.) | ✅ | > | componentProps.required | `true` | ❌ | is the field required? | ✅ | > | componentProps.values | - | ❌ | list of options for dropdown | ❌ | > | componentProps.placeholder | `glc_eyJvIj...` | ❌ | placeholder text for input | ✅ | > | componentProps.tooltip | `Obtained from your "My Dest" account` | ❌ | tooltip text for input | ✅ | > | renderCondition | `["MYDEST_URL", "!=", ""]` | ❌ | hide/show the field in the UI (form only) one-of: `[boolean]` `[string, operator, any]` where `string` is the key name of the dependency field, and `operator` is one-of: `!=` `==` `>=` `<=` `>` `<` | ❌ | > | hideFromReadData | `["MYDEST_URL", "==", ""]` | ❌ | hide/show the field in the UI (read only) one-of: `[boolean]` `[string, operator, any]` where `string` is the key name of the dependency field, and `operator` is one-of: `!=` `==` `>=` `<=` `>` `<` | ❌ | > | customReadDataLabels | - | ❌ | custom labels for the UI (read only) | ❌ | ```yaml mydest.yaml theme={null} apiVersion: internal.odigos.io/v1beta1 kind: Destination metadata: type: mydest displayName: My Destination category: managed spec: image: mydest.svg signals: traces: supported: true metrics: supported: true logs: supported: false fields: - name: MYDEST_URL displayName: URL componentType: input componentProps: required: true - name: MYDEST_REGION displayName: Region componentType: input componentProps: required: true - name: MYDEST_API_KEY displayName: API Key componentType: input componentProps: type: password required: true secret: true ``` ### Collector Configuration Now that our new vendor can be persisted/loaded in the Kubernetes data store, we need to implement the collector configuration. **1. Add Destination Type** Go to [`common/dests.go`](https://github.com/odigos-io/odigos/tree/main/common/dests.go) and add your new destination to the `DestinationType` enum. * Make sure the value is the same as the `type` property in `mydest.yaml` **2. Add Collector Config** Go to [`common/config`](https://github.com/odigos-io/odigos/tree/main/common/config) directory and create a new GO file. * Example: `mydest.go` > **Explain Config** > > * **DestType** - Returns the enum value of the destination added to [`common/dests.go`](https://github.com/odigos-io/odigos/tree/main/common/dests.go) in step 1. > * **ModifyConfig** - Is called with the `dest` object which holds the data received from the UI and the `currentConfig` object. The `currentConfig` object contains the current configuration of the gateway collector. Modify this object to include the [OpenTelemetry configuration](https://opentelemetry.io/docs/collector/configuration/) needed by your destination. You can assume a basic configuration is already provided in the `currentConfig` object, for details see `getBasicConfig` method in [`common/config/root.go`](https://github.com/odigos-io/odigos/tree/main/common/config/root.go) file. > * Make sure to give any exporter or pipeline a unique name in order to avoid conflicts, use the conventions: > * `otlp/-` for OTel gRPC exporters > * `otlphttp/-` for OTel HTTP exporters > * `traces/-` for traces pipelines > * `metrics/-` for metrics pipelines > * `logs/-` for logs pipelines > * You can use the utility methods `isTracingEnabled`, `isMetricsEnabled` and `isLoggingEnabled` to determine which signals are selected by the user for the destination, and configure the collector accordingly. ```go mydest.go theme={null} package config import ( "fmt" "github.com/odigos-io/odigos/common" ) const ( regionKey = "MYDEST_REGION" urlKey = "MYDEST_URL" apiKeyKey = "MYDEST_API_KEY" ) type MyDest struct{} func (m *MyDest) DestType() common.DestinationType { // DestinationType defined in common/dests.go return common.MyDestDestinationType } func (m *MyDest) ModifyConfig(dest ExporterConfigurer, currentConfig *Config) ([]string, error) { config := dest.GetConfig() // To make sure that the exporter and pipeline names are unique, we'll need to define a unique ID uniqueUri := "mydest-" + dest.GetID() region, exists := config[regionKey] if !exists { region = "us" return errorMissingKey(regionKey) } endpoint, exists := config[urlKey] if !exists { endpoint = fmt.Sprintf("https://%s.mydest.com:4317", region) } // Modify the exporter here exporterName := "otlp/" + uniqueUri exporterConfig := GenericMap{ "endpoint": endpoint, "headers": GenericMap{ // The API Key is a secret, so we can't expose it in the config "x-mydest-header-apikey": "${MYDEST_API_KEY}", }, } currentConfig.Exporters[exporterName] = exporterConfig // Modify the pipelines here var pipelineNames []string if isTracingEnabled(dest) { pipeName := "traces/" + uniqueUri currentConfig.Service.Pipelines[pipeName] = Pipeline{ Exporters: []string{exporterName}, } pipelineNames = append(pipelineNames, pipeName) } if isMetricsEnabled(dest) { pipeName := "metrics/" + uniqueUri currentConfig.Service.Pipelines[pipeName] = Pipeline{ Exporters: []string{exporterName}, } pipelineNames = append(pipelineNames, pipeName) } if isLoggingEnabled(dest) { pipeName := "logs/" + uniqueUri currentConfig.Service.Pipelines[pipeName] = Pipeline{ Exporters: []string{exporterName}, } pipelineNames = append(pipelineNames, pipeName) } return pipelineNames, nil } ``` **3. Add Available Config** Go to [`common/config/root.go`](https://github.com/odigos-io/odigos/tree/main/common/config/root.go) and add the new destination to the `availableConfigers` list. * Example: `&MyDest{}` ```go common/config/root.go theme={null} var availableConfigers = []Configer{ &MyDest{}, /* List of existing destinations... */ } ``` ### Kubernetes-Specific Collector Configuration If your destination configures Kubernetes settings, for example you have a config field that accepts a value that should be mounted in the Collector Pod, create a `K8sConfiger` object in [`instrumentor/k8sconfig`](https://github.com/odigos-io/odigos/tree/main/instrumentor/k8sconfig). This interface provides an additional function, `ModifyGatewayCollectorDeployment`, which accepts a Destination and Collector Deployment. Your implementation can use this function to modify the Deployment as necessary based on the Destination config. Note: It is the responsibility of your implementation to check for the validity of this config, such as checking for conflicts or values that already exist. The `K8sConfiger` interface also requires a `DestType()` function, similar to common Destinations. This function returns the type of common Destination that this Kubernetes implementation relies on. This is used by the instrumentor to conditionally apply the `K8sConfiger` only for the matching Destination. When it is implemented, add your `K8sConfiger` implementation to the `availableConfigers` list in [`instrumentor/k8sconfig/root.go`](https://github.com/odigos-io/odigos/tree/main/instrumentor/k8sconfig/root.go) ### Generating Documentation **1. Install Python** Make sure you have [Python installed](https://www.python.org/downloads/) on your system. **2. Generate Documentation** Go to [`docs`](https://github.com/odigos-io/odigos/tree/main/docs) directory, and run: ```bash theme={null} python sync-dest-doc.py # OR python3 sync-dest-doc.py ``` **3. Edit Documentation** The documentation has been generated in the [`docs/backends`](https://github.com/odigos-io/odigos/tree/main/docs/backends) directory. Feel free to add any additional content to the generated file. * Edit only between the `!! START CUSTOM EDIT !!` and `!! END CUSTOM EDIT !!` comments * Example: `mydest.mdx` ```mdx mydest.mdx theme={null} {/* !! Do not remove this comment, this acts as a key indicator in `docs/sync-dest-doc.py` !! !! START CUSTOM EDIT !! */} **Creating Account**
Go to the **[🔗 website](https://odigos.io) > Account** and click **Sign Up** **Obtaining Access Token**
Go to **⚙️ > Access Tokens** and click **Create New** {/* !! Do not remove this comment, this acts as a key indicator in `docs/sync-dest-doc.py` !! !! END CUSTOM EDIT !! */} ``` **4. Update README.md** Go to [`README.md`](https://github.com/odigos-io/odigos/tree/main/README.md) and add your new destination to the list of destinations. #### That's it! Now you can use your new destination in the UI and send data to it. **Please submit a PR to the [odigos git repository](https://github.com/odigos-io/odigos).** # actions.odigos.io/v1alpha1 Source: https://docs.odigos.io/enterprise/api-reference/actions.odigos.io.v1alpha1 ## Resource Types * [AddClusterInfo](#AddClusterInfo) * [DeleteAttribute](#DeleteAttribute) * [K8sAttributesResolver](#K8sAttributesResolver) * [RenameAttribute](#RenameAttribute) ## `AddClusterInfo` AddClusterInfo is the Schema for the addclusterinfo odigos action API DEPRECATED: Use odigosv1.Action instead
FieldTypeDescription
`apiVersion`string`/v1alpha1`
`kind`string`AddClusterInfo`
`metadata` \[Required] [`meta/v1.ObjectMeta`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#objectmeta-v1-meta) No description provided. Refer to the Kubernetes API documentation for the fields of the `metadata` field.
`spec` \[Required] [`AddClusterInfoSpec`](#AddClusterInfoSpec) No description provided.
`status` \[Required] [`AddClusterInfoStatus`](#AddClusterInfoStatus) No description provided.
## `DeleteAttribute` DeleteAttribute is the Schema for the DeleteAttribute odigos action API DEPRECATED: Use odigosv1.Action instead
FieldTypeDescription
`apiVersion`string`/v1alpha1`
`kind`string`DeleteAttribute`
`metadata` \[Required] [`meta/v1.ObjectMeta`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#objectmeta-v1-meta) No description provided. Refer to the Kubernetes API documentation for the fields of the `metadata` field.
`spec` \[Required] [`DeleteAttributeSpec`](#DeleteAttributeSpec) No description provided.
`status` \[Required] [`DeleteAttributeStatus`](#DeleteAttributeStatus) No description provided.
## `K8sAttributesResolver` K8sAttributesResolver allows adding an action to collect k8s attributes. DEPRECATED: Use odigosv1.Action instead
FieldTypeDescription
`apiVersion`string`/v1alpha1`
`kind`string`K8sAttributesResolver`
`metadata` \[Required] [`meta/v1.ObjectMeta`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#objectmeta-v1-meta) No description provided. Refer to the Kubernetes API documentation for the fields of the `metadata` field.
`spec` \[Required] [`K8sAttributesSpec`](#K8sAttributesSpec) No description provided.
`status` \[Required] [`K8sAttributesStatus`](#K8sAttributesStatus) No description provided.
## `RenameAttribute` RenameAttribute is the Schema for the RenameAttribute odigos action API DEPRECATED: Use odigosv1.Action instead
FieldTypeDescription
`apiVersion`string`/v1alpha1`
`kind`string`RenameAttribute`
`metadata` \[Required] [`meta/v1.ObjectMeta`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#objectmeta-v1-meta) No description provided. Refer to the Kubernetes API documentation for the fields of the `metadata` field.
`spec` \[Required] [`RenameAttributeSpec`](#RenameAttributeSpec) No description provided.
`status` \[Required] [`RenameAttributeStatus`](#RenameAttributeStatus) No description provided.
## `AddClusterInfoConfig` **Appears in:** * [ActionSpec](#odigos-io-v1alpha1-ActionSpec)
FieldTypeDescription
`clusterAttributes` \[Required] [`[]OtelAttributeWithValue`](#OtelAttributeWithValue) No description provided.
`overwriteExistingValues` \[Required] `bool` No description provided.
## `AddClusterInfoSpec` **Appears in:** * [AddClusterInfo](#AddClusterInfo) AddClusterInfoSpec defines the desired state of AddClusterInfo action
FieldTypeDescription
`actionName` \[Required] `string` No description provided.
`notes` \[Required] `string` No description provided.
`disabled` \[Required] `bool` No description provided.
`signals` \[Required] [`[]common.ObservabilitySignal`](https://pkg.go.dev/github.com/odigos-io/odigos/common#ObservabilitySignal) No description provided.
`clusterAttributes` \[Required] [`[]OtelAttributeWithValue`](#OtelAttributeWithValue) No description provided.
`overwriteExistingValues` \[Required] `bool` No description provided.
## `AddClusterInfoStatus` **Appears in:** * [AddClusterInfo](#AddClusterInfo) AddClusterInfoStatus defines the observed state of AddClusterInfo action
FieldTypeDescription
`conditions` \[Required] [`[]meta/v1.Condition`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#condition-v1-meta) Represents the observations of a addclusterinfo's current state. Known .status.conditions.type are: "Available", "Progressing"
## `DeleteAttributeConfig` **Appears in:** * [ActionSpec](#odigos-io-v1alpha1-ActionSpec)
FieldTypeDescription
`attributeNamesToDelete` \[Required] `[]string` No description provided.
## `DeleteAttributeSpec` **Appears in:** * [DeleteAttribute](#DeleteAttribute) DeleteAttributeSpec defines the desired state of DeleteAttribute action
FieldTypeDescription
`actionName` \[Required] `string` No description provided.
`notes` \[Required] `string` No description provided.
`disabled` \[Required] `bool` No description provided.
`signals` \[Required] [`[]common.ObservabilitySignal`](https://pkg.go.dev/github.com/odigos-io/odigos/common#ObservabilitySignal) No description provided.
`attributeNamesToDelete` \[Required] `[]string` No description provided.
## `DeleteAttributeStatus` **Appears in:** * [DeleteAttribute](#DeleteAttribute) DeleteAttributeStatus defines the observed state of DeleteAttribute action
FieldTypeDescription
`conditions` \[Required] [`[]meta/v1.Condition`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#condition-v1-meta) Represents the observations of a DeleteAttribute's current state. Known .status.conditions.type are: "Available", "Progressing"
## `K8sAnnotationAttribute` **Appears in:** * [K8sAttributesConfig](#K8sAttributesConfig) * [K8sAttributesSpec](#K8sAttributesSpec)
FieldTypeDescription
`annotationKey` \[Required] `string` The annotation name to be extracted. e.g. "kubectl.kubernetes.io/restartedAt"
`attributeKey` \[Required] `string` The attribute key to be used for the resource attribute created from the annotation. e.g. "kubectl.kubernetes.restartedAt"
`from` \[Required] `string` The source of the annotation. e.g. "pod" or "namespace" Deprecated: Use FromSources instead for specifying multiple sources with precedence.
`fromSources` \[Required] [`[]K8sAttributeSource`](#K8sAttributeSource) The sources from which to extract the annotation, in order of precedence (most specific first). When multiple sources are specified, the most specific source (e.g., pod) takes precedence over less specific sources (e.g., namespace). If an annotation exists in multiple sources, the value from the most specific source will be used. Supported sources: "pod", "namespace", "node"
## `K8sAttributeSource` (Alias of `string`) **Appears in:** * [K8sAnnotationAttribute](#K8sAnnotationAttribute) * [K8sLabelAttribute](#K8sLabelAttribute) ## `K8sAttributesConfig` **Appears in:** * [ActionSpec](#odigos-io-v1alpha1-ActionSpec)
FieldTypeDescription
`collectContainerAttributes` \[Required] `bool` Collect the following container related attributes: k8s.container.name container.id container.image.name container.image.tag
`collectReplicaSetAttributes` \[Required] `bool` collect replicaset related attributes (when relevant, e.g. for deployments): k8s.replicaset.name if CollectWorkloadUID is set, also collect: k8s.replicaset.uid DEPRECATED: ReplicaSet attributes are now collected by default during instrumentation.
`collectWorkloadUID` \[Required] `bool` Collect the following workload UID attributes: k8s.deployment.uid k8s.daemonset.uid k8s.statefulset.uid DEPRECATED: Workload UID attributes are now collected by default during instrumentation.
`collectClusterUID` \[Required] `bool` Collect the k8s.cluster.uid attribute, which is set to the uid of the namespace "kube-system"
`labelsAttributes` [`[]K8sLabelAttribute`](#K8sLabelAttribute) list of labels to be extracted from the pod, and the attribute key to be used for the resource attribute created from each label.
`annotationsAttributes` [`[]K8sAnnotationAttribute`](#K8sAnnotationAttribute) list of annotations to be extracted from the pod, and the attribute key to be used for the resource attribute created from each annotation.
## `K8sAttributesSpec` **Appears in:** * [K8sAttributesResolver](#K8sAttributesResolver)
FieldTypeDescription
`actionName` \[Required] `string` No description provided.
`notes` \[Required] `string` No description provided.
`disabled` \[Required] `bool` No description provided.
`signals` \[Required] [`[]common.ObservabilitySignal`](https://pkg.go.dev/github.com/odigos-io/odigos/common#ObservabilitySignal) No description provided.
`collectContainerAttributes` \[Required] `bool` Collect the following container related attributes: k8s.container.name container.id container.image.name container.image.tag
`collectReplicaSetAttributes` \[Required] `bool` collect replicaset related attributes (when relevant, e.g. for deployments): k8s.replicaset.name if CollectWorkloadUID is set, also collect: k8s.replicaset.uid DEPRECATED: ReplicaSet attributes are now collected by default during instrumentation.
`collectWorkloadUID` \[Required] `bool` Collect the following workload UID attributes: k8s.deployment.uid k8s.daemonset.uid k8s.statefulset.uid DEPRECATED: Workload UID attributes are now collected by default during instrumentation.
`collectClusterUID` \[Required] `bool` Collect the k8s.cluster.uid attribute, which is set to the uid of the namespace "kube-system"
`labelsAttributes` [`[]K8sLabelAttribute`](#K8sLabelAttribute) list of labels to be extracted from the pod, and the attribute key to be used for the resource attribute created from each label.
`annotationsAttributes` [`[]K8sAnnotationAttribute`](#K8sAnnotationAttribute) list of annotations to be extracted from the pod, and the attribute key to be used for the resource attribute created from each annotation.
## `K8sAttributesStatus` **Appears in:** * [K8sAttributesResolver](#K8sAttributesResolver) K8sAttributesStatus defines the observed state of K8sAttributes action
FieldTypeDescription
`conditions` \[Required] [`[]meta/v1.Condition`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#condition-v1-meta) Represents the observations of a k8sattributes' current state. Known .status.conditions.type are: "Available", "Progressing"
## `K8sLabelAttribute` **Appears in:** * [K8sAttributesConfig](#K8sAttributesConfig) * [K8sAttributesSpec](#K8sAttributesSpec)
FieldTypeDescription
`labelKey` \[Required] `string` The label name to be extracted. e.g. "app.kubernetes.io/name"
`attributeKey` \[Required] `string` The attribute key to be used for the resource attribute created from the label. e.g. "app.kubernetes.name"
`from` \[Required] [`K8sAttributeSource`](#K8sAttributeSource) The source of the label. e.g. "pod" or "namespace" Deprecated: Use FromSources instead for specifying multiple sources with precedence.
`fromSources` \[Required] [`[]K8sAttributeSource`](#K8sAttributeSource) The sources from which to extract the label, in order of precedence (most specific first). When multiple sources are specified, the most specific source (e.g., pod) takes precedence over less specific sources (e.g., namespace). If a label exists in multiple sources, the value from the most specific source will be used. Supported sources: "pod", "namespace", "node"
## `OtelAttributeWithValue` **Appears in:** * [AddClusterInfoConfig](#AddClusterInfoConfig) * [AddClusterInfoSpec](#AddClusterInfoSpec)
FieldTypeDescription
`attributeName` \[Required] `string` the name of the attribute to insert
`attributeStringValue` \[Required] `string` if the value is a string, this field should be used. empty string is a valid value
## `RenameAttributeConfig` **Appears in:** * [ActionSpec](#odigos-io-v1alpha1-ActionSpec)
FieldTypeDescription
`renames` \[Required] `map[string]string` No description provided.
## `RenameAttributeSpec` **Appears in:** * [RenameAttribute](#RenameAttribute) RenameAttributeSpec defines the desired state of RenameAttribute action
FieldTypeDescription
`actionName` \[Required] `string` No description provided.
`notes` \[Required] `string` No description provided.
`disabled` \[Required] `bool` No description provided.
`signals` \[Required] [`[]common.ObservabilitySignal`](https://pkg.go.dev/github.com/odigos-io/odigos/common#ObservabilitySignal) No description provided.
`renames` \[Required] `map[string]string` No description provided.
## `RenameAttributeStatus` **Appears in:** * [RenameAttribute](#RenameAttribute) RenameAttributeStatus defines the observed state of RenameAttribute action
FieldTypeDescription
`conditions` \[Required] [`[]meta/v1.Condition`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#condition-v1-meta) Represents the observations of a RenameAttribute's current state. Known .status.conditions.type are: "Available", "Progressing"
# odigos.io/v1alpha1 Source: https://docs.odigos.io/enterprise/api-reference/odigos.io.v1alpha1 Package v1alpha1 is the v1alpha1 version of the API. ## Resource Types * [Action](#odigos-io-v1alpha1-Action) * [CollectorsGroup](#odigos-io-v1alpha1-CollectorsGroup) * [Destination](#odigos-io-v1alpha1-Destination) * [InstrumentationConfig](#odigos-io-v1alpha1-InstrumentationConfig) * [InstrumentationInstance](#odigos-io-v1alpha1-InstrumentationInstance) * [InstrumentationRule](#odigos-io-v1alpha1-InstrumentationRule) * [Processor](#odigos-io-v1alpha1-Processor) * [Recommendation](#odigos-io-v1alpha1-Recommendation) * [Sampling](#odigos-io-v1alpha1-Sampling) * [Source](#odigos-io-v1alpha1-Source) ## `Action`
FieldTypeDescription
`apiVersion`string`odigos.io/v1alpha1`
`kind`string`Action`
`metadata` \[Required] [`meta/v1.ObjectMeta`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#objectmeta-v1-meta) No description provided. Refer to the Kubernetes API documentation for the fields of the `metadata` field.
`spec` \[Required] [`ActionSpec`](#odigos-io-v1alpha1-ActionSpec) No description provided.
`status` \[Required] [`ActionStatus`](#odigos-io-v1alpha1-ActionStatus) No description provided.
## `CollectorsGroup` CollectorsGroup is the Schema for the collectors API
FieldTypeDescription
`apiVersion`string`odigos.io/v1alpha1`
`kind`string`CollectorsGroup`
`metadata` \[Required] [`meta/v1.ObjectMeta`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#objectmeta-v1-meta) No description provided. Refer to the Kubernetes API documentation for the fields of the `metadata` field.
`spec` \[Required] [`CollectorsGroupSpec`](#odigos-io-v1alpha1-CollectorsGroupSpec) No description provided.
`status` \[Required] [`CollectorsGroupStatus`](#odigos-io-v1alpha1-CollectorsGroupStatus) No description provided.
## `Destination` Destination is the Schema for the destinations API
FieldTypeDescription
`apiVersion`string`odigos.io/v1alpha1`
`kind`string`Destination`
`metadata` \[Required] [`meta/v1.ObjectMeta`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#objectmeta-v1-meta) No description provided. Refer to the Kubernetes API documentation for the fields of the `metadata` field.
`spec` \[Required] [`DestinationSpec`](#odigos-io-v1alpha1-DestinationSpec) No description provided.
`status` \[Required] [`DestinationStatus`](#odigos-io-v1alpha1-DestinationStatus) No description provided.
## `InstrumentationConfig` InstrumentationConfig is the Schema for the instrumentationconfig API
FieldTypeDescription
`apiVersion`string`odigos.io/v1alpha1`
`kind`string`InstrumentationConfig`
`metadata` \[Required] [`meta/v1.ObjectMeta`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#objectmeta-v1-meta) No description provided. Refer to the Kubernetes API documentation for the fields of the `metadata` field.
`spec` \[Required] [`InstrumentationConfigSpec`](#odigos-io-v1alpha1-InstrumentationConfigSpec) No description provided.
`status` \[Required] [`InstrumentationConfigStatus`](#odigos-io-v1alpha1-InstrumentationConfigStatus) No description provided.
## `InstrumentationInstance` InstrumentationInstance is the Schema for the InstrumentationInstances API
FieldTypeDescription
`apiVersion`string`odigos.io/v1alpha1`
`kind`string`InstrumentationInstance`
`metadata` \[Required] [`meta/v1.ObjectMeta`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#objectmeta-v1-meta) No description provided. Refer to the Kubernetes API documentation for the fields of the `metadata` field.
`spec` \[Required] [`InstrumentationInstanceSpec`](#odigos-io-v1alpha1-InstrumentationInstanceSpec) No description provided.
`status` \[Required] [`InstrumentationInstanceStatus`](#odigos-io-v1alpha1-InstrumentationInstanceStatus) No description provided.
## `InstrumentationRule`
FieldTypeDescription
`apiVersion`string`odigos.io/v1alpha1`
`kind`string`InstrumentationRule`
`metadata` \[Required] [`meta/v1.ObjectMeta`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#objectmeta-v1-meta) No description provided. Refer to the Kubernetes API documentation for the fields of the `metadata` field.
`spec` \[Required] [`InstrumentationRuleSpec`](#odigos-io-v1alpha1-InstrumentationRuleSpec) No description provided.
`status` \[Required] [`InstrumentationRuleStatus`](#odigos-io-v1alpha1-InstrumentationRuleStatus) No description provided.
## `Processor` Processor is the Schema for an Opentelemetry Collector Processor that is added to Odigos pipeline
FieldTypeDescription
`apiVersion`string`odigos.io/v1alpha1`
`kind`string`Processor`
`metadata` \[Required] [`meta/v1.ObjectMeta`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#objectmeta-v1-meta) No description provided. Refer to the Kubernetes API documentation for the fields of the `metadata` field.
`spec` \[Required] [`ProcessorSpec`](#odigos-io-v1alpha1-ProcessorSpec) No description provided.
`status` \[Required] [`ProcessorStatus`](#odigos-io-v1alpha1-ProcessorStatus) No description provided.
## `Recommendation` Recommendation is the Schema for enabling a catalog recommendation in the cluster.
FieldTypeDescription
`apiVersion`string`odigos.io/v1alpha1`
`kind`string`Recommendation`
`metadata` \[Required] [`meta/v1.ObjectMeta`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#objectmeta-v1-meta) No description provided. Refer to the Kubernetes API documentation for the fields of the `metadata` field.
`spec` \[Required] [`RecommendationSpec`](#odigos-io-v1alpha1-RecommendationSpec) No description provided.
`status` \[Required] [`RecommendationStatus`](#odigos-io-v1alpha1-RecommendationStatus) No description provided.
## `Sampling` Sampling is the Schema for the sampling rules API.
FieldTypeDescription
`apiVersion`string`odigos.io/v1alpha1`
`kind`string`Sampling`
`metadata` \[Required] [`meta/v1.ObjectMeta`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#objectmeta-v1-meta) No description provided. Refer to the Kubernetes API documentation for the fields of the `metadata` field.
`spec` \[Required] [`SamplingSpec`](#odigos-io-v1alpha1-SamplingSpec) No description provided.
`status` \[Required] [`SamplingStatus`](#odigos-io-v1alpha1-SamplingStatus) No description provided.
## `Source` Source configures an application for auto-instrumentation.
FieldTypeDescription
`apiVersion`string`odigos.io/v1alpha1`
`kind`string`Source`
`metadata` \[Required] [`meta/v1.ObjectMeta`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#objectmeta-v1-meta) No description provided. Refer to the Kubernetes API documentation for the fields of the `metadata` field.
`spec` \[Required] [`SourceSpec`](#odigos-io-v1alpha1-SourceSpec) No description provided.
`status` \[Required] [`SourceStatus`](#odigos-io-v1alpha1-SourceStatus) No description provided.
## `ActionSpec` **Appears in:** * [Action](#odigos-io-v1alpha1-Action)
FieldTypeDescription
`actionName` \[Required] `string` Allows you to attach a meaningful name to the action for convenience. Odigos does not use or assume any meaning from this field.
`notes` \[Required] `string` A free-form text field that allows you to attach notes regarding the action for convenience. For example: why it was added. Odigos does not use or assume any meaning from this field.
`disabled` \[Required] `bool` A boolean field allowing to temporarily disable the action, but keep it around for future use
`signals` \[Required] [`[]common.ObservabilitySignal`](https://pkg.go.dev/github.com/odigos-io/odigos/common#ObservabilitySignal) Which signals should this action operate on.
`addClusterInfo` \[Required] `actions/v1alpha1.AddClusterInfoConfig` AddClusterInfo is the config for the AddClusterInfo Action.
`deleteAttribute` \[Required] `actions/v1alpha1.DeleteAttributeConfig` DeleteAttribute is the config for the DeleteAttribute Action.
`renameAttribute` \[Required] `actions/v1alpha1.RenameAttributeConfig` RenameAttribute is the config for the RenameAttribute Action.
`piiMasking` \[Required] `actions.PiiMaskingConfig` PiiMasking is the config for the PiiMasking Action.
`k8sAttributes` \[Required] `actions/v1alpha1.K8sAttributesConfig` K8sAttributes is the config for the K8sAttributes Action.
`urlTemplatization` \[Required] `actions.URLTemplatizationConfig` URLTemplatization is the config for the URLTemplatization Action.
`spanRenamer` \[Required] `actions.SpanRenamerConfig` SpanRenamer is the config for the SpanRenamer Action.
`extractAttribute` \[Required] `actions.ExtractAttributeConfig` ExtractAttribute is the config for the ExtractAttribute Action.
`dbQueryTemplatization` \[Required] `actions.DbQueryTemplatizationConfig` DbQueryTemplatization is the config for the DbQueryTemplatization Action.
`inferDbAttributes` \[Required] `actions.InferDbAttributesConfig` InferDbAttributes is the config for the InferDbAttributes Action.
## `ActionStatus` **Appears in:** * [Action](#odigos-io-v1alpha1-Action)
FieldTypeDescription
`conditions` \[Required] [`[]meta/v1.Condition`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#condition-v1-meta) Represents the observations of a action's current state. Known .status.conditions.type are: "Available", "Progressing"
## `AgentEnabledReason` (Alias of `string`) **Appears in:** * [ContainerAgentConfig](#odigos-io-v1alpha1-ContainerAgentConfig) ## `AgentsTelemetrySettings` **Appears in:** * [CollectorsGroupMetricsCollectionSettings](#odigos-io-v1alpha1-CollectorsGroupMetricsCollectionSettings) ## `Attribute` **Appears in:** * [InstrumentationInstanceStatus](#odigos-io-v1alpha1-InstrumentationInstanceStatus) * [InstrumentationLibraryStatus](#odigos-io-v1alpha1-InstrumentationLibraryStatus) Attribute is a key-value pair that describes a component or instrumentation
FieldTypeDescription
`key` \[Required] `string` No description provided.
`value` \[Required] `string` No description provided.
## `CollectorsGroupMetricsCollectionSettings` **Appears in:** * [CollectorsGroupSpec](#odigos-io-v1alpha1-CollectorsGroupSpec)
FieldTypeDescription
`spanMetrics` \[Required] [`common.MetricsSourceSpanMetricsConfiguration`](https://pkg.go.dev/github.com/odigos-io/odigos/common#MetricsSourceSpanMetricsConfiguration) if not nil for node collector, it means span to metrics is enabled, and the node collector should set it up in the pipeline. span to metrics is the ability to calculate metrics like http requests/errors/duration etc from the individual spans recorded for relevant operation.
`hostMetrics` \[Required] [`common.MetricsSourceHostMetricsConfiguration`](https://pkg.go.dev/github.com/odigos-io/odigos/common#MetricsSourceHostMetricsConfiguration) if not nil for node collector, it means host metrics is enabled, and the opentelemetry collector "hostmetrics" receiver should be included in the pipeline. host metrics are metrics that are collected from the host node, such as cpu, memory, disk, network, etc.
`kubeletStats` \[Required] [`common.MetricsSourceKubeletStatsConfiguration`](https://pkg.go.dev/github.com/odigos-io/odigos/common#MetricsSourceKubeletStatsConfiguration) if not nil for node collector, it means kubelet stats is enabled, and the opentelemetry collector "kubeletstats" receiver should be included in the pipeline. kubelet stats are metrics that are collected from the kubelet point of view, such as cpu, memory, disk, network, per pod, node and more.
`serviceGraph` \[Required] [`ServiceGraphSettings`](#odigos-io-v1alpha1-ServiceGraphSettings) if not nil for cluster collector, it means service graph is enabled, and metrics for the "connectivity" between services should be calculated to be exported to metrics destinations.
`odigosOwnMetrics` \[Required] [`OdigosOwnMetricsSettings`](#odigos-io-v1alpha1-OdigosOwnMetricsSettings) if not nil for node collector, it means that some metric destinations are intresseted in collecting metrics about: odigos, the collected data, and the pipeline itself. this allows for users to monitor and operate odigos within their existing system, create dashboards, alerting, and more.
`agentsTelemetry` \[Required] [`AgentsTelemetrySettings`](#odigos-io-v1alpha1-AgentsTelemetrySettings) this part controls the metrics which are received from agents in the otlp receiver. it is generally enabled when we want to record metrics, and listed here for completeness. any "otlp receiver" specific settings can go here
## `CollectorsGroupResourcesSettings` **Appears in:** * [CollectorsGroupSpec](#odigos-io-v1alpha1-CollectorsGroupSpec) The raw values to control the collectors group resources and behavior. any defaulting, validations and calculations should be done in the controllers that create this CR. Values will be used as is without any further processing.
FieldTypeDescription
`minReplicas` \[Required] `int` Minumum + Maximum number of replicas for the collector - these relevant only for gateway.
`maxReplicas` \[Required] `int` No description provided.
`memoryRequestMiB` \[Required] `int` MemoryRequestMiB is the memory resource request to be used on the pod template. it will be embedded in the as a resource request of the form `memory: Mi`
`memoryLimitMiB` \[Required] `int` This option sets the limit on the memory usage of the collector. since the memory limiter mechanism is heuristic, and operates on fixed intervals, while it cannot fully prevent OOMs, it can help in reducing the chances of OOMs in edge cases. the settings should prevent the collector from exceeding the memory request, so one can set this to the same value as the memory request or higher to allow for some buffer for bursts.
`cpuRequestMillicores` \[Required] `int` CPU resource request to be used on the pod template. it will be embedded in the as a resource request of the form `cpu: m`
`cpuLimitMillicores` \[Required] `int` CPU resource limit to be used on the pod template. it will be embedded in the as a resource limit of the form `cpu: m`
`memoryLimiterLimitMiB` \[Required] `int` this parameter sets the "limit\_mib" parameter in the memory limiter configuration for the collector. it is the hard limit after which a force garbage collection will be performed. this value will end up comparing against the go runtime reported heap Alloc value. According to the memory limiter docs: > Note that typically the total memory usage of process will be about 50MiB higher than this value > a test from nov 2024 showed that fresh odigos collector with no traffic takes 38MiB, > thus the 50MiB is a good value to start with.
`memoryLimiterSpikeLimitMiB` \[Required] `int` this parameter sets the "spike\_limit\_mib" parameter in the memory limiter configuration for the collector memory limiter. note that this is not the processor soft limit itself, but the diff in Mib between the hard limit and the soft limit. according to the memory limiter docs, it is recommended to set this to 20% of the hard limit. changing this value allows trade-offs between memory usage and resiliency to bursts.
`gomemlimitMiB` \[Required] `int` the GOMEMLIMIT environment variable value for the collector pod. this is when go runtime will start garbage collection. it is recommended to be set to 80% of the hard limit of the memory limiter.
## `CollectorsGroupRole` (Alias of `string`) **Appears in:** * [CollectorsGroupSpec](#odigos-io-v1alpha1-CollectorsGroupSpec) * [ProcessorSpec](#odigos-io-v1alpha1-ProcessorSpec) ## `CollectorsGroupSpec` **Appears in:** * [CollectorsGroup](#odigos-io-v1alpha1-CollectorsGroup) CollectorsGroupSpec defines the desired state of Collector
FieldTypeDescription
`role` \[Required] [`CollectorsGroupRole`](#odigos-io-v1alpha1-CollectorsGroupRole) No description provided.
`collectorOwnMetricsPort` \[Required] `int32` The port to use for exposing the collector's own metrics as a prometheus endpoint. This can be used to resolve conflicting ports when a collector is using the host network.
`resourcesSettings` \[Required] [`CollectorsGroupResourcesSettings`](#odigos-io-v1alpha1-CollectorsGroupResourcesSettings) Resources \[memory/cpu] settings for the collectors group. these settings are used to protect the collectors instances from:
  • running out of memory and being killed by the k8s OOM killer
  • consuming all available memory on the node which can lead to node instability
  • pushing back pressure to the instrumented applications
`serviceGraphDisabled` \[Required] `bool` ServiceGraphEnabled is a feature that allows you to visualize the service graph of your application. It is enabled by default and can be disabled by setting the enabled flag to false.
`serviceGraphExtraDimensions` \[Required] `[]string` ServiceGraphExtraDimensions are additional span attribute names to include as dimensions in the service graph metrics, on top of the default service.name dimension.
`serviceGraphVirtualNodePeerAttributes` \[Required] `[]string` ServiceGraphVirtualNodePeerAttributes is an ordered list of span attributes used to identify uninstrumented (virtual) nodes in the service graph. The connector picks the first attribute that has a value on the span. When nil/empty, the connector uses its built-in defaults: \[peer.service, db.name, db.system].
`enableDataCompression` \[Required] `bool` Deprecated - use OtlpExporterConfiguration instead. EnableDataCompression is a feature that allows you to enable data compression before sending data to the Gateway collector. It is disabled by default and can be enabled by setting the enabled flag to true.
`otlpExporterConfiguration` \[Required] [`common.OtlpExporterConfiguration`](https://pkg.go.dev/github.com/odigos-io/odigos/common#OtlpExporterConfiguration) OtlpExporterConfiguration is the configuration for the OTLP exporter from node collector to cluster gateway collector.
`resourceDetectors` \[Required] [`common.ResourceDetectorsConfiguration`](https://pkg.go.dev/github.com/odigos-io/odigos/common#ResourceDetectorsConfiguration) ResourceDetectors controls which OpenTelemetry resource detectors are enabled on the node collector's resourcedetection processor.
`clusterMetricsEnabled` \[Required] `bool` ClusterMetricsEnabled is a feature that allows you to enable the cluster metrics. It is disabled by default and can be enabled by setting the enabled flag to true.
`httpsProxyAddress` \[Required] `string` for destinations that uses https for exporting data, this value can be used to set the address for an https proxy. when unset or empty, no proxy will be used.
`metrics` \[Required] [`CollectorsGroupMetricsCollectionSettings`](#odigos-io-v1alpha1-CollectorsGroupMetricsCollectionSettings) configuration for metrics handling in this collectors group if metric collection is disabled, this will be nil the content is populated only if relevant to this collectors group it's being calculated based on active destinations and their settings, and global settings provided in the odigos configuration or instrumentation rules. it allows for the collector group reconciler to be simplified, and for visibility into the aggregated settings being used to derive configurations deployments and rollouts.
`nodeSelector` \[Required] `map[string]string` Node selector for the collectors group deployment. Use this to force the gateway to run only on nodes with specific labels. This is a hard requirement: the pod will be scheduled ONLY on nodes that match all labels. If no matching nodes exist, the pod will remain Pending.
`deploymentName` \[Required] `string` Deployment name for the collectors group deployment. Only relevant for cluster gateway collector.
`tailSampling` \[Required] `common/api/sampling.TailSamplingConfiguration` Sampling holds the sampling configuration derived from the OdigosConfiguration. Currently this is only relevant for the cluster gateway collector.
`samplingDryRun` \[Required] `bool` Set to true to enable dry run mode for sampling. When enabled, odigos will invoke the sampling logic, but will not drop any traces. This is useful while evaluating sampling rules to check for effectiveness and correctness before committing to any changes that might lose data.
`spanSamplingAttributes` \[Required] `common/api/sampling.SpanSamplingAttributesConfiguration` Controls whether spans are enhanced with sampling attributes (e.g. category and decisions). Capturing these attributes gives visibility into sampling decision-making and effective sampling percentages when viewing traces or querying the database with tools.
## `CollectorsGroupStatus` **Appears in:** * [CollectorsGroup](#odigos-io-v1alpha1-CollectorsGroup) CollectorsGroupStatus defines the observed state of Collector
FieldTypeDescription
`ready` \[Required] `bool` No description provided.
`receiverSignals` \[Required] [`[]common.ObservabilitySignal`](https://pkg.go.dev/github.com/odigos-io/odigos/common#ObservabilitySignal) Receiver Signals are the signals (trace, metrics, logs) that the collector has setup an otlp receiver for, thus it can accept data from an upstream component. this is used to determine if a workload should export each signal or not. this list is calculated based on the odigos destinations that were configured
`conditions` \[Required] [`[]meta/v1.Condition`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#condition-v1-meta) Represents the observations of a collectorsroup's current state. Known .status.conditions.type are: "Available", "Progressing"
## `ContainerAgentConfig` **Appears in:** * [InstrumentationConfigSpec](#odigos-io-v1alpha1-InstrumentationConfigSpec) ContainerAgentConfig is a configuration for a specific container in a workload.
FieldTypeDescription
`containerName` \[Required] `string` The name of the container to which this configuration applies.
`agentEnabled` \[Required] `bool` boolean flag to indicate if the agent should be enabled for this container.
`agentEnabledReason` \[Required] [`AgentEnabledReason`](#odigos-io-v1alpha1-AgentEnabledReason) An enum reason for the agent injection decision.
`agentEnabledMessage` \[Required] `string` free text message to provide more information about the instrumentation decision. can be left empty if reason is self-explanatory.
`podManifestInjectionOptional` \[Required] `bool` set to true if the agent used in this container can be injected without pod manifest changes.
`otelDistroName` \[Required] `string` The name of the otel distribution to use for this container. if the name is empty, this container should not be instrumented.
`distroParams` \[Required] `map[string]string` Additional parameters to the distro that controls how it's being applied. Keys are parameter names (like "libc") and values are the value to use for that parameter (glibc / musl)
`envInjectionMethod` \[Required] [`common.EnvInjectionDecision`](https://pkg.go.dev/github.com/odigos-io/odigos/common#EnvInjectionDecision) What method to use for injecting the agent environment variables (just those covered by the loader (PYTHONPATH, JAVA\_TOOLS\_OPTIONS, NODE\_OPTIONS)) Can be either "loader" or "pod-manifest". The injection should still check the actual values in the container manifest before injecting. Nil means that this container should not have env injection (agent should not be injected, or distro does not specify "loader" injection envs).
`traces` \[Required] `common/api/agentsignalconfig.AgentTracesConfig` Each enabled signal must be set with a non-nil value (even if the config content is empty). nil means that the signal is disabled and should not be instrumented/collected by the agent.
`metrics` \[Required] `common/api/agentsignalconfig.AgentMetricsConfig` No description provided.
`logs` \[Required] `common/api/agentsignalconfig.AgentLogsConfig` No description provided.
`agentDiagnostics` \[Required] [`common/api/instrumentationrules.AgentDiagnostics`](https://pkg.go.dev/github.com/odigos-io/odigos/common/api/instrumentationrules#AgentDiagnostics) Configure the log level for the agent itselg
## `ContainerOverride` **Appears in:** * [InstrumentationConfigSpec](#odigos-io-v1alpha1-InstrumentationConfigSpec) * [SourceSpec](#odigos-io-v1alpha1-SourceSpec)
FieldTypeDescription
`containerName` \[Required] `string` The name of the container to override.
`runtimeInfo` \[Required] [`RuntimeDetailsByContainer`](#odigos-io-v1alpha1-RuntimeDetailsByContainer) RuntimeInfo to use for agent enabling. If set for a container, the automatic detection will not be used for this container, and the distro to use will be calculated based on this value.
`otelDistroName` \[Required] `string` select one specific otel distro to use for this container. the selected distro must match the programming language and any constraints of the distro. if the programmin language is incorrect, the runtime info can be overridden to match
`allowConcurrentAgents` \[Required] `bool` Odigos by default will attempt to detect if another agent is already running in the container, and if so, will avoid adding odigos agent to the container. This option allows to override this setting for a specific container in a source. Can be used for selective setting of which containers should run odigos concurrently with other agents. empty means take odigos global config for this setting. when not empty, the value will override the global config for this container
## `CostReductionRule` **Appears in:** * [SamplingSpec](#odigos-io-v1alpha1-SamplingSpec)
FieldTypeDescription
`name` \[Required] `string` user provided name, for easier identification and reference. use short and descriptive name, like "health check", "always keep /transaction in payment service", etc. odigos does not use or assume any meaning from this field, but it is written as metric attribute, and stored as span attribute on participating spans.
`disabled` \[Required] `bool` if set to true, the rule will be disabled, e.g. will not be taken into account for any sampling decisions. disabled rules still participate in metrics calculations, allowing enhanced tools and data for troubleshooting and sampling maintenance.
`sourceScopes` \[Required] [`k8sconsts.SourcesScopes`](https://pkg.go.dev/github.com/odigos-io/odigos/api/k8sconsts#SourcesScopes) limit this rule to specific sources (by name, namespace, language, etc.) an empty list will match any source. if multiple items are set, the operation match if any one matches this relates to the "ResourceAttributes" part of a span.
`operation` \[Required] `common/api/sampling.TailSamplingOperationMatcher` limit this rule to specific operations. for example: specific endpoint or kafka topic. this field is optional, and if not set, the rule will be applied to all operations.
`percentageAtMost` \[Required] `float64` sampling percentage for cost reduction. this field is required. the final sampling percentage for traces that match this rule will be the highest possible, but at most this value.
`notes` \[Required] `string` optional free-form text field that allows you to attach notes for future context and maintenance. users can write why this rule was added, observations, document considerations, etc.
## `DestinationMetricsSettings` **Appears in:** * [DestinationSpec](#odigos-io-v1alpha1-DestinationSpec)
FieldTypeDescription
`spanMetricsEnabled` \[Required] `bool` following settings enables/disables specific metric sources true - collect and send this metric source false - do not collect and send this metric source nil - use the default setting (from destination manifest, or cluster global setting)
`hostMetricsEnabled` \[Required] `bool` No description provided.
`kubeletStatsEnabled` \[Required] `bool` No description provided.
`serviceGraphEnabled` \[Required] `bool` No description provided.
`odigosOwnMetricsEnabled` \[Required] `bool` No description provided.
`agentsTelemetryEnabled` \[Required] `bool` No description provided.
## `DestinationSpec` **Appears in:** * [Destination](#odigos-io-v1alpha1-Destination) DestinationSpec defines the desired state of Destination
FieldTypeDescription
`type` \[Required] [`common.DestinationType`](https://pkg.go.dev/github.com/odigos-io/odigos/common#DestinationType) No description provided.
`destinationName` \[Required] `string` No description provided.
`data` \[Required] `map[string]string` No description provided.
`secretRef` \[Required] [`core/v1.LocalObjectReference`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#localobjectreference-v1-core) No description provided.
`signals` \[Required] [`[]common.ObservabilitySignal`](https://pkg.go.dev/github.com/odigos-io/odigos/common#ObservabilitySignal) No description provided.
`disabled` \[Required] `bool` No description provided.
`metricsSettings` [`DestinationMetricsSettings`](#odigos-io-v1alpha1-DestinationMetricsSettings) MetricsSettings defines the metrics settings for this destination. ignored if destination does not support metrics or metrics are not enabled in signals
`sourceSelector` [`SourceSelector`](#odigos-io-v1alpha1-SourceSelector) SourceSelector defines which sources can send data to this destination. If not specified, defaults to "all".
## `DestinationStatus` **Appears in:** * [Destination](#odigos-io-v1alpha1-Destination) DestinationStatus defines the observed state of Destination
FieldTypeDescription
`conditions` \[Required] [`[]meta/v1.Condition`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#condition-v1-meta) Represents the observations of a destination's current state.
## `EnvVar` **Appears in:** * [RuntimeDetailsByContainer](#odigos-io-v1alpha1-RuntimeDetailsByContainer)
FieldTypeDescription
`name` \[Required] `string` No description provided.
`value` \[Required] `string` No description provided.
## `HighlyRelevantOperation` **Appears in:** * [SamplingSpec](#odigos-io-v1alpha1-SamplingSpec) define operations (spans) with high observability value. if found anywhere in the trace, the entire trace will be kept regaradless of any cost reduction rules.
FieldTypeDescription
`name` \[Required] `string` user provided name, for easier identification and reference. use short and descriptive name, like "health check", "always keep /transaction in payment service", etc. odigos does not use or assume any meaning from this field, but it is written as metric attribute, and stored as span attribute on participating spans.
`disabled` \[Required] `bool` if set to true, the rule will be disabled, e.g. will not be taken into account for any sampling decisions. disabled rules still participate in metrics calculations, allowing enhanced tools and data for troubleshooting and sampling maintenance.
`sourceScopes` \[Required] [`k8sconsts.SourcesScopes`](https://pkg.go.dev/github.com/odigos-io/odigos/api/k8sconsts#SourcesScopes) limit the operation to specific sources. an empty list will match any source. if multiple items are set, the operation match if any one matches this relates to the "ResourceAttributes" part of a span.
`error` \[Required] `bool` if "Error" is set to true, only spans with SpanStatus set to "Error" are considered
`durationAtLeastMs` \[Required] `int` if Duration is set, only operations with duration in milli seconds larger then this value are considered
`operation` \[Required] `common/api/sampling.TailSamplingOperationMatcher` optionally, limit this rule to specific operations. for example: specific endpoint or kafka topic. this field is optional, and if not set, the rule will be applied to all operations.
`percentageAtLeast` \[Required] `float64` traces that contains this operation will be sampled by at least this percentage. if unset, 100% of such the traces will be sampled.
`notes` \[Required] `string` optional free-form text field that allows you to attach notes for future context and maintenance. users can write why this rule was added, observations, document considerations, etc.
## `InstrumentationConfigSpec` **Appears in:** * [InstrumentationConfig](#odigos-io-v1alpha1-InstrumentationConfig) Config for the OpenTelemeetry SDKs that should be applied to a workload. The workload is identified by the owner reference
FieldTypeDescription
`serviceName` \[Required] `string` the service.name property is used to populate the `service.name` resource attribute in the telemetry generated by this workload
`agentInjectionEnabled` \[Required] `bool` determines if odigos should inject agents to pods of this workload.
`podManifestInjectionOptional` \[Required] `bool` true if all containers with agent injection enabled in this source can be enabled without pod manifest changes. if false, at least one container requires pod manifest changes to enable agent injection.
`containers` \[Required] [`[]ContainerAgentConfig`](#odigos-io-v1alpha1-ContainerAgentConfig) configuration for each instrumented container in the workload
`workloadCollectorConfig` \[Required] `[]common/api.ContainerCollectorConfig` No description provided.
`containersOverrides` \[Required] [`[]ContainerOverride`](#odigos-io-v1alpha1-ContainerOverride) will always list all containers of this workload by name, and override data in case it is configured on the source. this peoperty can be used to know all container names in the workload, even if other controllers did not yet run.
`containerOverridesHash` \[Required] `string` An hash of the containers overrides, used to determine if the overrides have changed for event filtering. this is updated only when the overrides are changed, and not when some other change in the source occurs.
`agentsMetaHash` \[Required] `string` this hash is used to determine the deployment of the agents. e.g. when the distro for container changes, or it's compatibility version, or something else that requires rollout, the hash change will indicate that. if the hash is empty, it means that no agent should be enabled in any pod container.
`agentsMetaHashChangedTime` \[Required] [`meta/v1.Time`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#time-v1-meta) The last time at which the agents meta hash value was changed. Pods created before this time may not be in alignment with the AgentsMetaHash. e.g. can lack the odigos label, or have a different value.
## `InstrumentationConfigStatus` **Appears in:** * [InstrumentationConfig](#odigos-io-v1alpha1-InstrumentationConfig)
FieldTypeDescription
`runtimeDetailsByContainer` \[Required] [`[]RuntimeDetailsByContainer`](#odigos-io-v1alpha1-RuntimeDetailsByContainer) Capture Runtime Details for the workloads that this CR applies to.
`conditions` \[Required] [`[]meta/v1.Condition`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#condition-v1-meta) Represents the observations of a InstrumentationConfig's current state.
`workloadRolloutHash` \[Required] `string` This hash is recorded only after the rollout took place. it allows us to determine if the workload needs to be rollout based on previous rollout and the current config. if this field is different than the spec.AgentsDeploymentHash it means rollout is needed or not yet updated.
`rollbackOccurred` \[Required] `bool` Check if rollback happened to an application
`instrumentationTime` \[Required] [`meta/v1.Time`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#time-v1-meta) This time recorded only after the rollout took place. This allows us to determine whether a crashing application should be rolled back or not
`podsManifestInjectionStatus` \[Required] [`PodsManifestInjectionStatus`](#odigos-io-v1alpha1-PodsManifestInjectionStatus) Represents the status of odigos MANIFEST injection to existing pods template.
## `InstrumentationInstanceSpec` **Appears in:** * [InstrumentationInstance](#odigos-io-v1alpha1-InstrumentationInstance)
FieldTypeDescription
`containerName` \[Required] `string` stores the name of the container in the pod where the SDK is running. The pod details can be found as the owner reference on the CR.
## `InstrumentationInstanceStatus` **Appears in:** * [InstrumentationInstance](#odigos-io-v1alpha1-InstrumentationInstance) InstrumentationInstanceStatus defines the observed state of InstrumentationInstance If the instrumentation is not active, this CR should be deleted
FieldTypeDescription
`identifyingAttributes` \[Required] [`[]Attribute`](#odigos-io-v1alpha1-Attribute) Attributes that identify the SDK and are reported as resource attributes in the generated telemetry. One can identify if an arbitrary telemetry is generated by this SDK by checking those resource attributes.
`nonIdentifyingAttributes` \[Required] [`[]Attribute`](#odigos-io-v1alpha1-Attribute) Attributes that are not reported as resource attributes but useful to describe characteristics of the SDK.
`healthy` \[Required] `bool` Healthy true means that the odigos agent has started the SDK, and there are no errors. User can expect telemetry to be generated. Healthy false means that the agent has stopped and telemetry data is not expected to be generated. Healthy nil means that the agent did not report any health status yet (prefer to always report health status).
`message` \[Required] `string` message is a human readable message indicating details about the SDK general health. can be omitted if healthy is true
`reason` \[Required] `string` reason contains a programmatic identifier indicating the reason for the component status. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API.
`lastStatusTime` \[Required] [`meta/v1.Time`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#time-v1-meta) No description provided.
`components` \[Required] [`[]InstrumentationLibraryStatus`](#odigos-io-v1alpha1-InstrumentationLibraryStatus) No description provided.
## `InstrumentationLibraryConfigTraces`
FieldTypeDescription
`enabled` \[Required] `bool` Whether the instrumentation library is enabled to record traces. When false, it is expected that the instrumentation library does not produce any spans regardless of any other configuration. When true, the instrumentation library should produce spans according to the other configuration options. If not specified, the default value for this signal should be used (whether to enable libraries by default or not).
## `InstrumentationLibraryId`
FieldTypeDescription
`libraryName` \[Required] `string` The name of the instrumentation library
  • Node.js: The name of the npm package: `@opentelemetry/instrumentation-`
`spanKind` \[Required] [`common.SpanKind`](https://pkg.go.dev/github.com/odigos-io/odigos/common#SpanKind) SpanKind is only supported by Golang and will be ignored for any other SDK language. In Go, SpanKind is used because the same instrumentation library can be utilized for different span kinds (e.g., client/server).
## `InstrumentationLibraryStatus` **Appears in:** * [InstrumentationInstanceStatus](#odigos-io-v1alpha1-InstrumentationInstanceStatus) InstrumentationLibraryStatus defines the observed state of an InstrumentationLibrary. if a library is not active/disable, it should not be included in the status
FieldTypeDescription
`name` \[Required] `string` for example ("net/http", "@opentelemetry/instrumentation-redis")
`type` \[Required] [`InstrumentationLibraryType`](#odigos-io-v1alpha1-InstrumentationLibraryType) No description provided.
`identifyingAttributes` \[Required] [`[]Attribute`](#odigos-io-v1alpha1-Attribute) Attributes that identify the component. The combination of (Name, Type, IdentifyingAttributes) must be unique.
`nonIdentifyingAttributes` \[Required] [`[]Attribute`](#odigos-io-v1alpha1-Attribute) Attributes that do not necessarily identify the component but help describe its characteristics.
`healthy` \[Required] `bool` No description provided.
`message` \[Required] `string` message is a human readable message indicating details about the component health. can be omitted if healthy is true
`reason` \[Required] `string` reason contains a programmatic identifier indicating the reason for the SDK status. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API.
`lastStatusTime` \[Required] [`meta/v1.Time`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#time-v1-meta) No description provided.
## `InstrumentationLibraryType` (Alias of `string`) **Appears in:** * [InstrumentationLibraryStatus](#odigos-io-v1alpha1-InstrumentationLibraryStatus) ## `InstrumentationRuleSpec` **Appears in:** * [InstrumentationRule](#odigos-io-v1alpha1-InstrumentationRule)
FieldTypeDescription
`ruleName` \[Required] `string` Allows you to attach a meaningful name to the rule for convenience. Odigos does not use or assume any meaning from this field.
`notes` \[Required] `string` A free-form text field that allows you to attach notes regarding the rule for convenience. For example: why it was added. Odigos does not use or assume any meaning from this field.
`disabled` \[Required] `bool` A boolean field allowing to temporarily disable the rule, but keep it around for future use
`scopes` \[Required] [`k8sconsts.SourcesScopes`](https://pkg.go.dev/github.com/odigos-io/odigos/api/k8sconsts#SourcesScopes) SourcesScopes lists SourcesScope entries to which the rule should be applied. If unset or empty, the rule applies to all workloads.
`instrumentationLibraries` \[Required] [`[]github.com/odigos-io/odigos/api/odigos/v1alpha1.InstrumentationLibraryGlobalId`](#odigos-io-v1alpha1-\[]github-com-odigos-io-odigos-api-odigos-v1alpha1-InstrumentationLibraryGlobalId) For fine grained control, the user can specify the instrumentation library to use. One can specify same rule for multiple languages and libraries at the same time. If nil, all instrumentation libraries will be used. If empty, no instrumentation libraries will be used.
`payloadCollection` \[Required] [`common/api/instrumentationrules.PayloadCollection`](https://pkg.go.dev/github.com/odigos-io/odigos/common/api/instrumentationrules#PayloadCollection) Allows to configure payload collection aspects for different types of payloads.
`otelDistros` \[Required] [`common/api/instrumentationrules.OtelDistros`](https://pkg.go.dev/github.com/odigos-io/odigos/common/api/instrumentationrules#OtelDistros) Set the otel distros to use instead of the defaults.
`codeAttributes` \[Required] [`common/api/instrumentationrules.CodeAttributes`](https://pkg.go.dev/github.com/odigos-io/odigos/common/api/instrumentationrules#CodeAttributes) Configure which code attributes should be recorded as span attributes.
`headersCollection` \[Required] [`common/api/instrumentationrules.HttpHeadersCollection`](https://pkg.go.dev/github.com/odigos-io/odigos/common/api/instrumentationrules#HttpHeadersCollection) Allows to configure the collection of http headers for different types of payloads.
`traceConfig` \[Required] [`common/api/instrumentationrules.TraceConfig`](https://pkg.go.dev/github.com/odigos-io/odigos/common/api/instrumentationrules#TraceConfig) Configure the tracing configuration for the library.
`customInstrumentations` \[Required] [`common/api/instrumentationrules.CustomInstrumentationsWithMetadata`](https://pkg.go.dev/github.com/odigos-io/odigos/common/api/instrumentationrules#CustomInstrumentationsWithMetadata) Add custom instrumentation probes
`headSamplingFallbackFraction` \[Required] [`common/api/instrumentationrules.HeadSamplingFallbackFraction`](https://pkg.go.dev/github.com/odigos-io/odigos/common/api/instrumentationrules#HeadSamplingFallbackFraction) Configure general fraction of traces to record if none of the rules evaluate to true. this can help in reducing very noisy and heavy traffic services. note that traces will be dropped regardless of thier attributes/errors/importance. @deprecated: use odigos config to set this value instead.
`ebpfLogCapture` \[Required] [`common/api/instrumentationrules.EbpfLogCapture`](https://pkg.go.dev/github.com/odigos-io/odigos/common/api/instrumentationrules#EbpfLogCapture) Configure eBPF-based log capture. When enabled, the node collector logs pipeline will use only the eBPF receiver instead of the filelog receiver, and odiglet will register instrumented processes for eBPF log capture.
`networkMetrics` \[Required] [`common/api/instrumentationrules.NetworkMetricsConfig`](https://pkg.go.dev/github.com/odigos-io/odigos/common/api/instrumentationrules#NetworkMetricsConfig) Configure network flow and TCP stats metrics for scoped workloads.
`traceVerbosity` \[Required] [`common/api/instrumentationrules.TraceVerbosity`](https://pkg.go.dev/github.com/odigos-io/odigos/common/api/instrumentationrules#TraceVerbosity) Configure the verbosity of the traces for the library.
`agentDiagnostics` \[Required] [`common/api/instrumentationrules.AgentDiagnostics`](https://pkg.go.dev/github.com/odigos-io/odigos/common/api/instrumentationrules#AgentDiagnostics) Configure the agent own logging configuration.
`kernelTraces` \[Required] [`common/api/instrumentationrules.KernelTraces`](https://pkg.go.dev/github.com/odigos-io/odigos/common/api/instrumentationrules#KernelTraces) Adds spans for the operating system work of the scoped workloads, from any language, like the files they open and the processes they start. A span is a child of the span in progress when the work happens. File and process spans start a trace when there is none.
## `InstrumentationRuleStatus` **Appears in:** * [InstrumentationRule](#odigos-io-v1alpha1-InstrumentationRule)
FieldTypeDescription
`conditions` \[Required] [`[]meta/v1.Condition`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#condition-v1-meta) Represents the observations of a instrumentationrule's current state. Known .status.conditions.type are: "Available", "Progressing"
## `NoisyOperation` **Appears in:** * [SamplingSpec](#odigos-io-v1alpha1-SamplingSpec) endpoints (or other operations) which are considered "noise", and provide no or very little observability value. these traces should not be collected at all, or dropped aggresevly. motivation is data sentization and performance improvment (even if cost is not a factor)examples:
  • health-checks (readiness and liveness probes)
  • metrics scrape endpoints (prometheus /metrics endpoint)
  • other agents calling home (outgoing http requests to collector.my.vendor.com)
FieldTypeDescription
`name` \[Required] `string` user provided name, for easier identification and reference. use short and descriptive name, like "health check", "always keep /transaction in payment service", etc. odigos does not use or assume any meaning from this field, but it is written as metric attribute, and stored as span attribute on participating spans.
`disabled` \[Required] `bool` if set to true, the rule will be disabled, e.g. will not be taken into account for any sampling decisions. disabled rules still participate in metrics calculations, allowing enhanced tools and data for troubleshooting and sampling maintenance.
`sourceScopes` \[Required] [`k8sconsts.SourcesScopes`](https://pkg.go.dev/github.com/odigos-io/odigos/api/k8sconsts#SourcesScopes) limit this rule to specific sources (by name, namespace, language, etc.) for example: if "other agent" rule for noisty operation is relevant only in java, limit this rule by setting source scope to java and prevent other languages from being affected if the list is empty - all sources are matched.
`operation` \[Required] `common/api/sampling.HeadSamplingOperationMatcher` limit this rule to specific operations. for example: specific http server endpoint (GET "/healthz" as an example). this field is optional, and if not set, the rule will be applied to all operations.
`percentageAtMost` \[Required] `float64` sampling percentage for noisy operations. if unset, 0% of such the traces will be collected. this percentage has "at most" semantics - the final sampling percentage for traces that match this rule will be the highest possible, but at most this value.
`notes` \[Required] `string` optional free-form text field that allows you to attach notes for future context and maintenance. users can write why this rule was added, observations, document considerations, etc.
## `OdigosOwnMetricsSettings` **Appears in:** * [CollectorsGroupMetricsCollectionSettings](#odigos-io-v1alpha1-CollectorsGroupMetricsCollectionSettings) configuration for collecting and exporting odigos own metrics. e.g. metrics about odigos components, and not about the user's application.
FieldTypeDescription
`sendToMetricsDestinations` \[Required] `bool` if true, odigos will send all the metrics it collects about itself to the metrics pipeline, which will make them available to the metrics destinations. users can troubleshoot odigos itself by monitoring these metrics in their existing systems, and create their own dashboards, alerting, and more.
`sendToOdigosMetricsStore` \[Required] `bool` if true, odigos will send all the metrics it collects about itself to the odigos metrics store, which is available to odigos UI. it can help in presenting a consistent view of odigos itself, without relying on user system and integrations.
`interval` \[Required] `string` time interval for flusing metrics (format: 15s, 1m etc). defaults: 10s
## `OtherAgent` **Appears in:** * [RuntimeDetailsByContainer](#odigos-io-v1alpha1-RuntimeDetailsByContainer)
FieldTypeDescription
`name` \[Required] `string` No description provided.
## `PodsManifestInjectionStatus` **Appears in:** * [InstrumentationConfigStatus](#odigos-io-v1alpha1-InstrumentationConfigStatus) represents the status of odigos MANIFEST injection to existing pods template. each pod can be in one of 3 states: injected and up-to-date, injected and out-of-date, or not injected. actual agent in pod container can be injected or not regardless of the pod manifest injection status. status only shows if pods exists from each category and not count, to avoid frequent (noisy/expensive) updates in steady state
FieldTypeDescription
`hasInjectedUpToDatePods` \[Required] `bool` if the source has any pods which are using the latest agent deployment setup.
`hasInjectedOutOfDatePods` \[Required] `bool` if the source has any pods which are using an outdated agent deployment setup.
`hasUninjectedPods` \[Required] `bool` if the source has any pods which do not have the odigos agent injected.
## `ProcessorSpec` **Appears in:** * [Processor](#odigos-io-v1alpha1-Processor) ProcessorSpec defines the an OpenTelemetry Collector processor in odigos telemetry pipeline
FieldTypeDescription
`type` \[Required] `string` type of the processor (batch, attributes, etc). this field is only the type, not it's instance name in the collector configuration yaml
`processorName` \[Required] `string` this name is solely for the user convenience, to attach a meaningful name to the processor. odigos must not assume any semantics from this name. odigos cannot assume this name is unique, not empty, exclude spaces or dots, limited in length, etc.
`notes` \[Required] `string` user can attach notes to the processor, to document its purpose, usage, etc.
`disabled` \[Required] `bool` disable is a flag to enable or disable the processor. if the processor is disabled, it will not be included in the collector configuration yaml. this allows the user to keep the processor configuration in the CR, but disable it temporarily.
`signals` \[Required] [`[]common.ObservabilitySignal`](https://pkg.go.dev/github.com/odigos-io/odigos/common#ObservabilitySignal) signals can be used to control which observability signals are processed by the processor.
`collectorRoles` \[Required] [`[]CollectorsGroupRole`](#odigos-io-v1alpha1-CollectorsGroupRole) control which collector roles in odigos pipeline this processor is attached to.
`orderHint` \[Required] `int` control the order of processors. a processor with lower order hint value will be placed before other processors with higher value. if 2 processors have the same value, the order is arbitrary. if the value is missing (or 0) the processor can be placed anywhere in the pipeline
`processorConfig` \[Required] [`k8s.io/apimachinery/pkg/runtime.RawExtension`](https://pkg.go.dev/k8s.io/apimachinery/pkg/runtime/#RawExtension) this it the configuration of the opentelemetry collector processor component with the type specified in 'type'.
## `ProcessorStatus` **Appears in:** * [Processor](#odigos-io-v1alpha1-Processor) ProcessorStatus defines the observed state of the processor
FieldTypeDescription
`conditions` \[Required] [`[]meta/v1.Condition`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#condition-v1-meta) Represents the observations of a processor's current state.
## `RecommendationSpec` **Appears in:** * [Recommendation](#odigos-io-v1alpha1-Recommendation) RecommendationSpec defines the desired state of Recommendation
FieldTypeDescription
`type` \[Required] [`common.RecommendationType`](https://pkg.go.dev/github.com/odigos-io/odigos/common#RecommendationType) Type identifies which recommendation from the catalog this resource enables.
`applied` `bool` Applied indicates whether this recommendation is currently applied (via the recommendation flow or configured organically).
`conditionsMet` `bool` ConditionsMet indicates whether the catalog prerequisites for this recommendation currently hold (for example GoEnterpriseSources for AutoGoOffsetUpdater).
## `RecommendationStatus` **Appears in:** * [Recommendation](#odigos-io-v1alpha1-Recommendation) RecommendationStatus defines the observed state of Recommendation
FieldTypeDescription
`conditions` \[Required] [`[]meta/v1.Condition`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#condition-v1-meta) Represents the observations of a recommendation's current state.
## `RuntimeDetailsByContainer` **Appears in:** * [ContainerOverride](#odigos-io-v1alpha1-ContainerOverride) * [InstrumentationConfigStatus](#odigos-io-v1alpha1-InstrumentationConfigStatus)
FieldTypeDescription
`containerName` \[Required] `string` No description provided.
`language` \[Required] [`common.ProgrammingLanguage`](https://pkg.go.dev/github.com/odigos-io/odigos/common#ProgrammingLanguage) No description provided.
`runtimeVersion` \[Required] `string` No description provided.
`envVars` \[Required] [`[]EnvVar`](#odigos-io-v1alpha1-EnvVar) No description provided.
`otherAgents` \[Required] [`[]OtherAgent`](#odigos-io-v1alpha1-OtherAgent) OtherAgents lists other instrumentation agents detected in the container (a process can carry more than one); empty when none.
`libCType` \[Required] [`common.LibCType`](https://pkg.go.dev/github.com/odigos-io/odigos/common#LibCType) No description provided.
`secureExecutionMode` \[Required] `bool` Indicates whether the target process is running is secure-execution mode. nil means we were unable to determine the secure-execution mode.
`criErrorMessage` \[Required] `string` CriErrorMessage is set if the value in EnvFromContainerRuntime was not computed correctly and cannot be used safely. Sometimes, even if CRI check failed, it is possible to tell that relevant env vars are not coming from container runtime. Thus, this field is set only when there is:
  • Actual CRI check failed
  • The observed environment variables might come from container runtime
`envFromContainerRuntime` \[Required] [`[]EnvVar`](#odigos-io-v1alpha1-EnvVar) Holds the environment variables retrieved from the container runtime.
## `SamplingSpec` **Appears in:** * [Sampling](#odigos-io-v1alpha1-Sampling) define sampling rules. the rules can be defined as one or multiple objects in kubernetes, and are all joined together to form the global sampling rules. odigos users can group rules based on whatever criteria that makes sense for them, for example - by team, by client, by usecase, admin-policy, etc.
FieldTypeDescription
`name` \[Required] `string` give these sampling rules a name for display, easier identification and reference.
`notes` \[Required] `string` a free-form text field that allows you to attach notes regardinag the rule for convenience. Odigos does not use or assume any meaning from this field.
`noisyOperations` \[Required] [`[]NoisyOperation`](#odigos-io-v1alpha1-NoisyOperation) No description provided.
`highlyRelevantOperations` \[Required] [`[]HighlyRelevantOperation`](#odigos-io-v1alpha1-HighlyRelevantOperation) No description provided.
`costReductionRules` \[Required] [`[]CostReductionRule`](#odigos-io-v1alpha1-CostReductionRule) No description provided.
## `SamplingStatus` **Appears in:** * [Sampling](#odigos-io-v1alpha1-Sampling) SamplingStatus defines the observed state of Sampling.
FieldTypeDescription
`conditions` \[Required] [`[]meta/v1.Condition`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#condition-v1-meta) Represents the observations of a Sampling's current state. Known .status.conditions.type are: "Available", "Progressing"
## `ServiceGraphSettings` **Appears in:** * [CollectorsGroupMetricsCollectionSettings](#odigos-io-v1alpha1-CollectorsGroupMetricsCollectionSettings) ## `SourceSelector` **Appears in:** * [DestinationSpec](#odigos-io-v1alpha1-DestinationSpec)
FieldTypeDescription
`namespaces` `[]string` If a namespace is specified, all workloads (sources) within that namespace are allowed to send data. Example: namespaces: \["default", "production"] This means the destination will receive data from all sources in "default" and "production" namespaces.
`dataStreams` `[]string` Workloads (sources) are assigned to Datastreams via labels (odigos.io/data-stream: true), allowing a more flexible selection mechanism. Example: dataStreams: \["backend", "monitoring"] This means the destination will receive data only from sources labeled with "backend" or "monitoring".
## `SourceSpec` **Appears in:** * [Source](#odigos-io-v1alpha1-Source)
FieldTypeDescription
`workload` \[Required] [`k8sconsts.PodWorkload`](https://pkg.go.dev/github.com/odigos-io/odigos/api/k8sconsts#PodWorkload) Workload represents the workload or namespace to be instrumented. This field is required upon creation and cannot be modified.
`disableInstrumentation` \[Required] `bool` DisableInstrumentation excludes this workload from auto-instrumentation.
`otelServiceName` `string` OtelServiceName determines the "service.name" resource attribute which will be reported by the instrumentations of this source. If not set, the workload name will be used. It is not valid for namespace sources.
`containerOverrides` [`[]ContainerOverride`](#odigos-io-v1alpha1-ContainerOverride) Specify specific override values for containers in a workload source. Not valid for namespace sources. Can be used to set the runtime info in case the automatic detection fails or produce wrong results. Containers are identified by their names. All containers not listed will retain their default behavior.
`matchWorkloadNameAsRegex` `bool` MatchWorkloadNameAsRegex indicates that the workload name should be matched using regex. When true, spec.workload.name is treated as a regular expression pattern. This allows matching multiple workloads with a single Source CRD. Not valid for namespace sources.
## `SourceStatus` **Appears in:** * [Source](#odigos-io-v1alpha1-Source)
FieldTypeDescription
`conditions` \[Required] [`[]meta/v1.Condition`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#condition-v1-meta) Represents the observations of a source's current state. Known .status.conditions.type are: "Available", "Progressing"
# operator.odigos.io/v1alpha1 Source: https://docs.odigos.io/enterprise/api-reference/operator.odigos.io.v1alpha1 ## Resource Types ## `Odigos` Odigos is the Schema for the odigos API
FieldTypeDescription
`metadata` \[Required] [`meta/v1.ObjectMeta`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#objectmeta-v1-meta) No description provided. Refer to the Kubernetes API documentation for the fields of the `metadata` field.
`spec` \[Required] [`OdigosSpec`](#OdigosSpec) No description provided.
`status` \[Required] [`OdigosStatus`](#OdigosStatus) No description provided.
## `OdigosSpec` **Appears in:** * [Odigos](#Odigos) OdigosSpec defines the desired state of Odigos
FieldTypeDescription
`onPremToken` \[Required] `string` (Optional) OnPremToken is an enterprise token for Odigos Enterprise.
`uiMode` \[Required] [`common.UiMode`](https://pkg.go.dev/github.com/odigos-io/odigos/common#UiMode) (Optional) UIMode sets the UI mode to either "normal" or "readonly". In "normal" mode the UI is fully interactive, allowing users to view and edit Odigos configuration and settings. In "readonly" mode, the UI can only be used to view current Odigos configuration and is not interactive. Default=default
`telemetryEnabled` \[Required] `bool` (Optional) TelemetryEnabled records general telemetry regarding Odigos usage. Default=false
`ignoredNamespaces` \[Required] `[]string` (Optional) IgnoredNamespaces is a list of namespaces to not show in the Odigos UI.
`ignoredContainers` \[Required] `[]string` (Optional) IgnoredContainers is a list of container names to exclude from instrumentation (useful for ignoring sidecars).
`profiles` \[Required] [`[]common.ProfileName`](https://pkg.go.dev/github.com/odigos-io/odigos/common#ProfileName) (Optional) Profiles is a list of preset profiles with a specific configuration.
`agentEnvVarsInjectionMethod` \[Required] [`common.EnvInjectionMethod`](https://pkg.go.dev/github.com/odigos-io/odigos/common#EnvInjectionMethod) (Optional) AgentEnvVarsInjectionMethod is the method to inject the Odigos agent env vars into the pod. Default=pod-manifest
`nodeSelector` \[Required] `map[string]string` (Optional) NodeSelector is a map of key-value Kubernetes NodeSelector labels to apply to all Odigos components. Note that Odigos will only be able to instrument applications on the same node.
`skipWebhookIssuerCreation` \[Required] `bool` (Optional) SkipWebhookIssuerCreation skips creating the Issuer and Certificate for the Instrumentor pod webhook if cert-manager is installed. Default=false
`podSecurityPolicy` \[Required] `bool` (Optional) PodSecurityPolicy allows Odigos pods to use a privileged pod security policy. Default=false
`imagePrefix` \[Required] `string` (Optional) ImagePrefix is a prefix for all container images. This should only be used if you are pulling Odigos images from the non-default registry. Default (community): docker.io/keyval Default (enterprise): registry.odigos.io Default (OpenShift): registry.connect.redhat.com/odigos
`logLevel` \[Required] `string` (Optional) LogLevel sets the default log level for all Odigos components (e.g. instrumentor, odiglet, collector). Accepted values: debug, info, warn, error. Default=info when unset.
`mountMethod` \[Required] [`common.MountMethod`](https://pkg.go.dev/github.com/odigos-io/odigos/common#MountMethod) (Optional) MountMethod optionally defines the mechanism for mounting Odigos files into instrumented pods. One of "k8s-virtual-device" (default) or "k8s-host-path".
`openshiftEnabled` \[Required] `bool` (Optional) OpenShiftEnabled configures selinux on OpenShift nodes. DEPRECATED: OpenShift clusters are auto-detected and this API field will be removed in a future release.
## `OdigosStatus` **Appears in:** * [Odigos](#Odigos) OdigosStatus defines the observed state of Odigos
FieldTypeDescription
`conditions` \[Required] [`[]meta/v1.Condition`](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#condition-v1-meta) Conditions store the status conditions of the Odigos instances
# Overview Source: https://docs.odigos.io/enterprise/backends-overview Odigos makes it simple to add and configure destinations, allowing you to select the specific signals (`traces`,`metrics`,`logs`) that you want to send to each destination. > [!TIP] > > Can't find your backend in Odigos? Please tell us! We are constantly adding new integrations.\\ > > You can also follow our quick [add new destination](/adding-new-dest) guide and submit a PR. | | | | Traces | Metrics | Logs | Profiles | | - | - | - | :-: | :-: | :-: | :-: | | ![alibabacloud](https://d15jtxgb40qetw.cloudfront.net/alibabacloud.svg) | [Alibaba Cloud](/backends/alibabacloud) | Managed | ✅ | | | | | ![appdynamics](https://d15jtxgb40qetw.cloudfront.net/appdynamics.svg) | [AppDynamics](/backends/appdynamics) | Managed | ✅ | ✅ | ✅ | | | ![cloudwatch](https://d15jtxgb40qetw.cloudfront.net/awscloudwatch.svg) | [AWS CloudWatch](/backends/awscloudwatch) | Managed | | ✅ | ✅ | | | ![s3](https://d15jtxgb40qetw.cloudfront.net/awss3.svg) | [AWS S3](/backends/awss3) | Managed | ✅ | ✅ | ✅ | | | ![xray](https://d15jtxgb40qetw.cloudfront.net/awsxray.svg) | [AWS X-Ray](/backends/awsxray) | Managed | ✅ | | | | | ![axiom](https://d15jtxgb40qetw.cloudfront.net/axiom.svg) | [Axiom](/backends/axiom) | Managed | ✅ | | ✅ | | | ![azureblob](https://d15jtxgb40qetw.cloudfront.net/blobstorage.svg) | [Azure Blob Storage](/backends/azureblob) | Managed | ✅ | | ✅ | | | ![azuremonitor](https://d15jtxgb40qetw.cloudfront.net/azuremonitor.svg) | [Azure Monitor](/backends/azuremonitor) | Managed | ✅ | ✅ | ✅ | | | ![betterstack](https://d15jtxgb40qetw.cloudfront.net/betterstack.svg) | [Better Stack](/backends/betterstack) | Managed | | ✅ | ✅ | | | ![bonree](https://d15jtxgb40qetw.cloudfront.net/bonree.svg) | [Bonree ONE](/backends/bonree) | Managed | ✅ | ✅ | | | | ![causely](https://d15jtxgb40qetw.cloudfront.net/causely.svg) | [Causely](/backends/causely) | Managed | ✅ | ✅ | | | | ![checkly](https://d15jtxgb40qetw.cloudfront.net/checkly.svg) | [Checkly](/backends/checkly) | Managed | ✅ | | | | | ![chronosphere](https://d15jtxgb40qetw.cloudfront.net/chronosphere.svg) | [Chronosphere](/backends/chronosphere) | Managed | ✅ | ✅ | | | | ![clickhouse](https://d15jtxgb40qetw.cloudfront.net/clickhouse.svg) | [Clickhouse](/backends/clickhouse) | Self-Hosted | ✅ | ✅ | ✅ | | | ![coralogix](https://d15jtxgb40qetw.cloudfront.net/coralogix.svg) | [Coralogix](/backends/coralogix) | Managed | ✅ | ✅ | ✅ | | | ![dash0](https://d15jtxgb40qetw.cloudfront.net/dash0.svg) | [Dash0](/backends/dash0) | Managed | ✅ | ✅ | ✅ | | | ![datadog](https://d15jtxgb40qetw.cloudfront.net/datadog.svg) | [Datadog](/backends/datadog) | Managed | ✅ | ✅ | ✅ | | | ![dynamic](https://d15jtxgb40qetw.cloudfront.net/opentelemetry.svg) | [Dynamic Destination](/backends/dynamic) | Self-Hosted | ✅ | ✅ | ✅ | ✅ | | ![dynatrace](https://d15jtxgb40qetw.cloudfront.net/dynatrace.svg) | [Dynatrace](/backends/dynatrace) | Managed | ✅ | ✅ | ✅ | | | ![elasticapm](https://d15jtxgb40qetw.cloudfront.net/elasticapm.svg) | [Elastic APM](/backends/elasticapm) | Managed | ✅ | ✅ | ✅ | | | ![elasticsearch](https://d15jtxgb40qetw.cloudfront.net/elasticsearch.svg) | [Elasticsearch](/backends/elasticsearch) | Self-Hosted | ✅ | | ✅ | | | ![qryn](https://d15jtxgb40qetw.cloudfront.net/gigapipe.svg) | [Gigapipe](/backends/gigapipe) | Managed | ✅ | ✅ | ✅ | | | ![googlecloud](https://d15jtxgb40qetw.cloudfront.net/gcp.svg) | [Google Cloud Monitoring](/backends/googlecloudmonitoring) | Managed | ✅ | | ✅ | | | ![googlecloudotlp](https://d15jtxgb40qetw.cloudfront.net/gcp.svg) | [Google Cloud (OTLP)](/backends/googlecloudotlp) | Managed | ✅ | | | | | ![grafanacloudloki](https://d15jtxgb40qetw.cloudfront.net/grafana.svg) | [Grafana Cloud Loki](/backends/grafanacloudloki) | Managed | | | ✅ | | | ![grafanacloudprometheus](https://d15jtxgb40qetw.cloudfront.net/grafana.svg) | [Grafana Cloud Prometheus](/backends/grafanacloudprometheus) | Managed | | ✅ | | | | ![grafanacloudtempo](https://d15jtxgb40qetw.cloudfront.net/grafana.svg) | [Grafana Cloud Tempo](/backends/grafanacloudtempo) | Managed | ✅ | | | | | ![greptime](https://d15jtxgb40qetw.cloudfront.net/greptime.svg) | [GreptimeDB](/backends/greptime) | Managed | | ✅ | | | | ![groundcover](https://d15jtxgb40qetw.cloudfront.net/groundcover.svg) | [Groundcover inCloud](/backends/groundcover) | Managed | ✅ | ✅ | ✅ | | | ![honeycomb](https://d15jtxgb40qetw.cloudfront.net/honeycomb.svg) | [Honeycomb](/backends/honeycomb) | Managed | ✅ | ✅ | ✅ | | | ![hyperdx](https://d15jtxgb40qetw.cloudfront.net/hyperdx.svg) | [HyperDX](/backends/hyperdx) | Managed | ✅ | ✅ | ✅ | | | ![instana](https://d15jtxgb40qetw.cloudfront.net/instana.svg) | [IBM Instana](/backends/instana) | Managed | ✅ | ✅ | ✅ | | | ![jaeger](https://d15jtxgb40qetw.cloudfront.net/jaeger.svg) | [Jaeger](/backends/jaeger) | Self-Hosted | ✅ | | | | | ![kafka](https://d15jtxgb40qetw.cloudfront.net/kafka.svg) | [Kafka](/backends/kafka) | Self-Hosted | ✅ | ✅ | ✅ | | | ![kloudmate](https://d15jtxgb40qetw.cloudfront.net/kloudmate.svg) | [KloudMate](/backends/kloudmate) | Managed | ✅ | ✅ | ✅ | | | ![last9](https://d15jtxgb40qetw.cloudfront.net/last9.svg) | [Last9](/backends/last9) | Managed | ✅ | ✅ | ✅ | | | ![lightstep](https://d15jtxgb40qetw.cloudfront.net/lightstep.svg) | [Lightstep](/backends/lightstep) | Managed | ✅ | | | | | ![logzio](https://d15jtxgb40qetw.cloudfront.net/logzio.svg) | [Logz.io](/backends/logzio) | Managed | ✅ | ✅ | ✅ | | | ![loki](https://d15jtxgb40qetw.cloudfront.net/loki.svg) | [Loki](/backends/loki) | Self-Hosted | | | ✅ | | | ![lumigo](https://d15jtxgb40qetw.cloudfront.net/lumigo.svg) | [Lumigo](/backends/lumigo) | Managed | ✅ | ✅ | ✅ | | | ![middleware](https://d15jtxgb40qetw.cloudfront.net/middleware.svg) | [Middleware](/backends/middleware) | Managed | ✅ | ✅ | ✅ | | | ![newrelic](https://d15jtxgb40qetw.cloudfront.net/newrelic.svg) | [New Relic](/backends/newrelic) | Managed | ✅ | ✅ | ✅ | | | ![observe](https://d15jtxgb40qetw.cloudfront.net/observe.svg) | [Observe](/backends/observe) | Managed | ✅ | ✅ | ✅ | | | ![oneuptime](https://d15jtxgb40qetw.cloudfront.net/oneuptime.svg) | [OneUptime](/backends/oneuptime) | Managed | ✅ | ✅ | ✅ | | | ![openobserve](https://d15jtxgb40qetw.cloudfront.net/openobserve.svg) | [OpenObserve](/backends/openobserve) | Managed | ✅ | | ✅ | | | ![oracle](https://d15jtxgb40qetw.cloudfront.net/oracle.svg) | [Oracle Cloud](/backends/oracle) | Managed | ✅ | ✅ | | | | ![otlp](https://d15jtxgb40qetw.cloudfront.net/opentelemetry.svg) | [OTLP gRPC](/backends/otlp) | Self-Hosted | ✅ | ✅ | ✅ | ✅ | | ![otlphttp](https://d15jtxgb40qetw.cloudfront.net/opentelemetry.svg) | [OTLP http](/backends/otlphttp) | Self-Hosted | ✅ | ✅ | ✅ | ✅ | | ![prometheus](https://d15jtxgb40qetw.cloudfront.net/prometheus.svg) | [Prometheus](/backends/prometheus) | Self-Hosted | | ✅ | | | | ![pyroscope](https://d15jtxgb40qetw.cloudfront.net/pyroscope.svg) | [Pyroscope](/backends/pyroscope) | Self-Hosted | | | | ✅ | | ![qryn-oss](https://d15jtxgb40qetw.cloudfront.net/qryn.svg) | [qryn](/backends/qryn) | Self-Hosted | ✅ | ✅ | ✅ | | | ![quickwit](https://d15jtxgb40qetw.cloudfront.net/quickwit.svg) | [Quickwit](/backends/quickwit) | Self-Hosted | ✅ | | ✅ | | | ![seq](https://d15jtxgb40qetw.cloudfront.net/seq.svg) | [Seq](/backends/seq) | Self-Hosted | ✅ | | ✅ | | | ![signalfx](https://d15jtxgb40qetw.cloudfront.net/signalfx.svg) | [SignalFx](/backends/signalfx) | Managed | ✅ | ✅ | | | | ![signoz](https://d15jtxgb40qetw.cloudfront.net/signoz.svg) | [SigNoz](/backends/signoz) | Self-Hosted | ✅ | ✅ | ✅ | | | ![splunk](https://d15jtxgb40qetw.cloudfront.net/splunk.svg) | [Splunk (Legacy) (Deprecated)](/backends/splunk) | Managed | ✅ | | | | | ![splunkotlp](https://d15jtxgb40qetw.cloudfront.net/splunk.svg) | [Splunk (OTLP)](/backends/splunkotlp) | Managed | ✅ | | | | | ![sumologic](https://d15jtxgb40qetw.cloudfront.net/sumologic.svg) | [Sumo Logic](/backends/sumologic) | Managed | ✅ | ✅ | ✅ | | | ![telemetryhub](https://d15jtxgb40qetw.cloudfront.net/telemetryhub.svg) | [TelemetryHub](/backends/telemetryhub) | Managed | ✅ | ✅ | ✅ | | | ![tempo](https://d15jtxgb40qetw.cloudfront.net/tempo.svg) | [Tempo](/backends/tempo) | Self-Hosted | ✅ | | | | | ![tingyun](https://d15jtxgb40qetw.cloudfront.net/tingyun.svg) | [Tingyun 基调听云](/backends/tingyun) | Managed | ✅ | ✅ | | | | ![traceloop](https://d15jtxgb40qetw.cloudfront.net/traceloop.svg) | [Traceloop](/backends/traceloop) | Managed | ✅ | ✅ | | | | ![uptrace](https://d15jtxgb40qetw.cloudfront.net/uptrace.svg) | [Uptrace](/backends/uptrace) | Managed | ✅ | ✅ | ✅ | | | ![victoriametricscloud](https://d15jtxgb40qetw.cloudfront.net/victoriametrics.svg) | [VictoriaMetrics Cloud](/backends/victoriametricscloud) | Managed | | ✅ | | | # Alibaba Cloud Source: https://docs.odigos.io/enterprise/backends/alibabacloud Configuring the Alibaba Cloud backend (Managed) ### Getting Started ![alibabacloud](https://d15jtxgb40qetw.cloudfront.net/alibabacloud.svg) ### Configuring Destination Fields > **Supported Signals:** > > ✅ Traces > ❌ Metrics > ❌ Logs > ❌ Profiles * **ALIBABA\_ENDPOINT** `string` : OTLP gRPC Endpoint. The format is `host:port`, host is required, port is required. Do not add the prefix `http://`. * This field is required * **ALIBABA\_TOKEN** `string` : Token. * This field is required ### Adding Destination to Odigos There are two primary methods for configuring destinations in Odigos: ##### **Using the UI** **Step 1** Use the [Odigos CLI](https://docs.odigos.io/cli/odigos_ui) to access the UI ```bash theme={null} odigos ui ``` **Step 2** Click on `Add Destination`, select `Alibaba Cloud` and follow the on-screen instructions ##### **Using Kubernetes manifests** **Step 1** Save the YAML below to a file (e.g. `alibabacloud.yaml`) ```yaml theme={null} apiVersion: odigos.io/v1alpha1 kind: Destination metadata: name: alibabacloud-example namespace: odigos-system spec: data: ALIBABA_ENDPOINT: destinationName: alibabacloud secretRef: name: alibabacloud-secret signals: - TRACES type: alibabacloud --- apiVersion: v1 data: ALIBABA_TOKEN: kind: Secret metadata: name: alibabacloud-secret namespace: odigos-system type: Opaque ``` **Step 2** Apply the YAML using `kubectl` ```bash theme={null} kubectl apply -f alibabacloud.yaml ``` # AppDynamics Source: https://docs.odigos.io/enterprise/backends/appdynamics Configuring the AppDynamics backend (Managed) ### Getting Started ![appdynamics](https://d15jtxgb40qetw.cloudfront.net/appdynamics.svg) 1. [Register](https://accounts.appdynamics.com/trial)/[Login](https://login.appdynamics.com/sso/authenticate) to AppDynamics. 2. Navigate to the OpenTelemetry Configuration page 3. Click on `Processors`, you'll find 3 attributes, locate `appdynamics.controller.account` and copy its value, this is your `Account Name`. 4. Click on `Exporters`, copy the `Endpoint`, and generate an `API Key`. ### Configuring Destination Fields > **Supported Signals:** > > ✅ Traces > ✅ Metrics > ✅ Logs > ❌ Profiles * **APPDYNAMICS\_APPLICATION\_NAME** `string` : Application Name. Will define a namespace in AppDynamics * This field is optional * **APPDYNAMICS\_ACCOUNT\_NAME** `string` : Account Name. * This field is required * **APPDYNAMICS\_ENDPOINT\_URL** `string` : Endpoint URL. * This field is required * **APPDYNAMICS\_API\_KEY** `string` : API Key. * This field is required ### Adding Destination to Odigos There are two primary methods for configuring destinations in Odigos: ##### **Using the UI** **Step 1** Use the [Odigos CLI](https://docs.odigos.io/cli/odigos_ui) to access the UI ```bash theme={null} odigos ui ``` **Step 2** Click on `Add Destination`, select `AppDynamics` and follow the on-screen instructions ##### **Using Kubernetes manifests** **Step 1** Save the YAML below to a file (e.g. `appdynamics.yaml`) ```yaml theme={null} apiVersion: odigos.io/v1alpha1 kind: Destination metadata: name: appdynamics-example namespace: odigos-system spec: data: APPDYNAMICS_ACCOUNT_NAME: APPDYNAMICS_ENDPOINT_URL: # Note: The commented fields below are optional. # APPDYNAMICS_APPLICATION_NAME: destinationName: appdynamics secretRef: name: appdynamics-secret signals: - TRACES - METRICS - LOGS type: appdynamics --- apiVersion: v1 data: APPDYNAMICS_API_KEY: kind: Secret metadata: name: appdynamics-secret namespace: odigos-system type: Opaque ``` **Step 2** Apply the YAML using `kubectl` ```bash theme={null} kubectl apply -f appdynamics.yaml ``` # AWS CloudWatch Source: https://docs.odigos.io/enterprise/backends/awscloudwatch Configuring the AWS CloudWatch backend (Managed) ### Getting Started ![cloudwatch](https://d15jtxgb40qetw.cloudfront.net/awscloudwatch.svg) > [!WARNING] > > Make sure that you have the necessary `AWS Credentials` and permissions set up.\\ > > AWS credentials are retrieved from the [default credential chain](https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials). **Setting up AWS credentials with AWS EKS (Elastic Kubernetes Service)** The following command will create a link between your EKS cluster and your IAM account, effectively allowing the EKS cluster to assume IAM roles and access AWS services. Replace `$EKS_CLUSTER_REGION` with the region of your EKS cluster and `$EKS_CLUSTER_NAME` with the name of your EKS cluster (or set them as environment variables). ```bash theme={null} eksctl utils associate-iam-oidc-provider --region=$EKS_CLUSTER_REGION --cluster=$EKS_CLUSTER_NAME --approve ``` **Setting up the IAM policy** ```json theme={null} { "Version": "2012-10-17", "Statement": [ { "Sid": "PushLogs", "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:::log-group::log-stream:" }, { "Sid": "CreateLogGroup", "Effect": "Allow", "Action": "logs:CreateLogGroup", "Resource": "arn:aws:logs:::log-group:" }, { "Sid": "DescribeLogGroups", "Effect": "Allow", "Action": "logs:DescribeLogGroups", "Resource": "arn:aws:logs:::log-group:" } ] } ``` ### Configuring Destination Fields > **Supported Signals:** > > ❌ Traces > ✅ Metrics > ✅ Logs > ❌ Profiles * **AWS\_CLOUDWATCH\_LOG\_GROUP\_NAME** `string` : Log Group Name. The group name of the CloudWatch Logs. If it does not exist it will be created automatically. * This field is required * **AWS\_CLOUDWATCH\_LOG\_STREAM\_NAME** `string` : Log Stream Name. The stream name of the CloudWatch Logs. If it does not exist it will be created automatically. * This field is required * **AWS\_CLOUDWATCH\_REGION** `string` : Region. The AWS region where the log stream is in. Region must be specified if it is not already set in the default credential chain. * This field is optional * **AWS\_CLOUDWATCH\_ENDPOINT** `string` : Endpoint. The CloudWatch Logs service endpoint which the requests are forwarded to. * This field is optional * **AWS\_CLOUDWATCH\_LOG\_RETENTION** `string` : Log Retention. LogRetention is the option to set the log retention policy for only newly created CloudWatch Log Groups. The value is in days, 0 = Never Expire. This value can also be changed later-on via the AWS console (UI) or AWS API, it's not a permanent decision once set. Also, the value here might not reflect the actual retention value in the destination if it was modified or some automatic policy is applied. * This field is optional and defaults to `0` * **AWS\_CLOUDWATCH\_TAGS** `{ key: string; value: string; }[]` : Tags. Tags is the option to set tags for the CloudWatch Log Group. If specified, please add at most 50 tags. Keys must be between 1-128 characters and follow the pattern: (alphanumerics, whitespace, and \_.:/=+-!). Values must be between 1-256 characters and follow the pattern: (alphanumerics, whitespace, and \_.:/=+-!). * This field is optional * **AWS\_CLOUDWATCH\_RAW\_LOG** `boolean` : Raw Log. If set to true, only the log message will be exported to CloudWatch Logs. This needs to be set to true for EMF logs. * This field is optional and defaults to `False` * **AWS\_CLOUDWATCH\_METRICS\_NAMESPACE** `string` : Metrics Namespace. Customized CloudWatch metrics namespace. Metrics in different namespaces are isolated from each other. Please note this is not a cluster namespace. * This field is optional and defaults to `Odigos` * **AWS\_CLOUDWATCH\_METRICS\_DIMENSION\_ROLLUP** `string` : Metrics Dimension Rollup. The option for metrics dimension rollup. * This field is optional and defaults to `NoDimensionRollup` * **AWS\_CLOUDWATCH\_METRICS\_DETAILED** `boolean` : Detailed Metrics. Retain detailed datapoint values in exported metrics (e.g instead of exporting a quantile as a statistical value, preserve the quantile's population). * This field is optional and defaults to `False` * **AWS\_CLOUDWATCH\_RETAIN\_INITIAL\_VALUE\_OF\_DELTA\_METRIC** `boolean` : Retain Initial Value of Delta Metric. This option specifies how the first value of a metric is handled. AWS EMF expects metric values to only contain deltas to the previous value. In the default case the first received value is therefor not sent to AWS but only used as a baseline for follow up changes to this metric. This is fine for high throughput metrics with stable labels. In this case it does not matter if the first value of this metric is discarded. However when your metric describes infrequent events or events with high label cardinality, then the exporter in default configuration would still drop the first occurrence of this metric. With this configuration value set to true the first value of all metrics will instead be send to AWS. * This field is optional and defaults to `False` > [!NOTE] > > * If the log group and/or log stream are specified in an EMF log, that EMF log will be exported to that log group and/or log stream (i.e. ignores the log group and log stream defined in the configuration). > * The log group and log stream will also be created automatically if they do not already exist. > * Example of an EMF log with log group and log stream: > ```json theme={null} > { > "_aws": { > "Timestamp": 1574109732004, > "LogGroupName": "Foo", > "LogStreamName": "Bar", > "CloudWatchMetrics": [ > { > "Namespace": "MyApp", > "Dimensions": [ > [ > "Operation" > ] > ], > "Metrics": [ > { > "Name": "ProcessingLatency", > "Unit": "Milliseconds", > "StorageResolution": 60 > } > ] > } > ] > }, > "Operation": "Aggregator", > "ProcessingLatency": 100 > } > ``` > * Resource ARNs (Amazon Resource Name (ARN) of the AWS resource running the collector) are currently not supported with the CloudWatch Logs Exporter. ### Adding Destination to Odigos There are two primary methods for configuring destinations in Odigos: ##### **Using the UI** **Step 1** Use the [Odigos CLI](https://docs.odigos.io/cli/odigos_ui) to access the UI ```bash theme={null} odigos ui ``` **Step 2** Click on `Add Destination`, select `AWS CloudWatch` and follow the on-screen instructions ##### **Using Kubernetes manifests** **Step 1** Save the YAML below to a file (e.g. `cloudwatch.yaml`) ```yaml theme={null} apiVersion: odigos.io/v1alpha1 kind: Destination metadata: name: cloudwatch-example namespace: odigos-system spec: data: AWS_CLOUDWATCH_LOG_GROUP_NAME: AWS_CLOUDWATCH_LOG_STREAM_NAME: # Note: The commented fields below are optional. # AWS_CLOUDWATCH_REGION: # AWS_CLOUDWATCH_ENDPOINT: # AWS_CLOUDWATCH_LOG_RETENTION: # AWS_CLOUDWATCH_TAGS: # AWS_CLOUDWATCH_RAW_LOG: # AWS_CLOUDWATCH_METRICS_NAMESPACE: # AWS_CLOUDWATCH_METRICS_DIMENSION_ROLLUP: # AWS_CLOUDWATCH_METRICS_DETAILED: # AWS_CLOUDWATCH_RETAIN_INITIAL_VALUE_OF_DELTA_METRIC: destinationName: cloudwatch signals: - METRICS - LOGS type: cloudwatch ``` **Step 2** Apply the YAML using `kubectl` ```bash theme={null} kubectl apply -f cloudwatch.yaml ``` # AWS S3 Source: https://docs.odigos.io/enterprise/backends/awss3 Configuring the AWS S3 backend (Managed) ### Getting Started ![s3](https://d15jtxgb40qetw.cloudfront.net/awss3.svg) **Setting up AWS S3 Bucket** If you haven't already, you need to create an S3 bucket to store your data. You can do it using the [AWS Management Console](https://console.aws.amazon.com/s3/home) or the [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html). For example, to create a bucket named `otel-data` in region `us-east-1` using the AWS CLI, you can run the following command: ```bash theme={null} aws s3api create-bucket --bucket otel-data --region us-east-1 ``` > [!WARNING] > > Make sure that you have the necessary `AWS Credentials` and permissions set up.\\ > > AWS credentials are retrieved from the [default credential chain](https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials). **Setting up AWS credentials with AWS EKS (Elastic Kubernetes Service)** The following command will create a link between your EKS cluster and your IAM account, effectively allowing the EKS cluster to assume IAM roles and access AWS services. Replace `$EKS_CLUSTER_REGION` with the region of your EKS cluster and `$EKS_CLUSTER_NAME` with the name of your EKS cluster (or set them as environment variables). ```bash theme={null} eksctl utils associate-iam-oidc-provider --region=$EKS_CLUSTER_REGION --cluster=$EKS_CLUSTER_NAME --approve ``` **Setting up the IAM policy** ```json theme={null} { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:PutObjectAcl", "s3:GetObject", "s3:GetObjectAcl", "s3:DeleteObject" ], "Resource": ["arn:aws:s3:::", "arn:aws:s3:::/*"] } ] } ``` You can do it with the aws cli. * Replace `otel-data` with the name of your bucket if you used a different name. * The policy name is `odigos-s3` in this example, you can use it or choose a different name. Take note of the policy ARN, you will need it in the next step. ```bash theme={null} aws iam create-policy --policy-name odigos-s3 --policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:PutObjectAcl", "s3:GetObject", "s3:GetObjectAcl", "s3:DeleteObject" ], "Resource": ["arn:aws:s3:::otel-data", "arn:aws:s3:::otel-data/*"] } ] }' ``` Or use the aws management console to create the policy. The last step is to configure this IAM policy to be assumed by the EKS cluster. Use the following cli command as template and adjust it according to your setup: * make sure to replace the `--attach-policy-arn` value with the ARN of the policy you created in the previous step. * use your EKS cluster name and region. ```bash theme={null} eksctl create iamserviceaccount \ --name default \ --namespace odigos-system \ --cluster otel-cluster \ --region=us-east-1 \ --attach-policy-arn arn:aws:iam::123456789012:policy/odigos-s3 \ --override-existing-serviceaccounts \ --approve ``` **Format** The aws s3 exporter supports two formats: `otlp_json` and `otlp_proto`. Each batch of logs / metrics / spans will be written as a single s3 object in the specified bucket. The content of the object will be the serialized data in the [OpenTelemetry Protocol format](https://github.com/open-telemetry/opentelemetry-proto), represented as either JSON or Protocol Buffers. For example, the following JSON string represents a single span in `otlp_json` format, from Odigos demo application: ```json theme={null} {"resourceSpans":[{"resource":{"attributes":[{"key":"telemetry.sdk.language","value":{"stringValue":"python"}},{"key":"telemetry.sdk.name","value":{"stringValue":"opentelemetry"}},{"key":"telemetry.sdk.version","value":{"stringValue":"1.19.0"}},{"key":"service.name","value":{"stringValue":"inventory"}},{"key":"odigos.device","value":{"stringValue":"python"}},{"key":"telemetry.auto.version","value":{"stringValue":"0.40b0"}},{"key":"k8s.namespace.name","value":{"stringValue":"default"}},{"key":"k8s.deployment.name","value":{"stringValue":"inventory"}},{"key":"k8s.pod.name","value":{"stringValue":"inventory-7b87f7566c-2d6fq"}},{"key":"container.name","value":{"stringValue":"inventory"}},{"key":"k8s.node.name","value":{"stringValue":"ip-192-168-4-178.ec2.internal"}}]},"scopeSpans":[{"scope":{"name":"opentelemetry.instrumentation.flask","version":"0.40b0"},"spans":[{"traceId":"9ee5a0de5802d3f1e7f93440f892509c","spanId":"88a4bfb5bfcaf297","parentSpanId":"f9d7bb9e9243df06","name":"/buy","kind":2,"startTimeUnixNano":"1707600957298456744","endTimeUnixNano":"1707600958303042894","attributes":[{"key":"http.method","value":{"stringValue":"POST"}},{"key":"http.server_name","value":{"stringValue":"0.0.0.0"}},{"key":"http.scheme","value":{"stringValue":"http"}},{"key":"net.host.port","value":{"intValue":"8080"}},{"key":"http.host","value":{"stringValue":"inventory:8080"}},{"key":"http.target","value":{"stringValue":"/buy?id=10"}},{"key":"net.peer.ip","value":{"stringValue":"192.168.13.194"}},{"key":"http.user_agent","value":{"stringValue":"Java/17.0.9"}},{"key":"net.peer.port","value":{"intValue":"49420"}},{"key":"http.flavor","value":{"stringValue":"1.1"}},{"key":"http.route","value":{"stringValue":"/buy"}},{"key":"http.status_code","value":{"intValue":"200"}}],"status":{}}]}]}]} ``` ### Configuring Destination Fields > **Supported Signals:** > > ✅ Traces > ✅ Metrics > ✅ Logs > ❌ Profiles * **S3\_BUCKET** `string` : Bucket Name. The name of the bucket where the data will be stored * This field is required * **S3\_REGION** `string` : Bucket Region. The AWS region where the bucket is located * This field is required * **S3\_PARTITION** `string` : Time granularity of S3 Bucket (Deprecated, use Partition Format). Deprecated field for time granularity. Use S3\_PARTITION\_FORMAT for custom formats. * This field is optional and defaults to `minute` * **S3\_PARTITION\_FORMAT** `string` : S3 Partition Format. Custom partition format using strftime syntax (e.g., '%Y/%m/%d/%H/%M' for minute-level, '%Y/%m/%d/%H' for hour-level). If not specified, S3\_PARTITION will be used. * This field is optional * Example: `%Y/%m/%d/%H/%M` * **S3\_MARSHALER** `string` : Marshaller (Data Format). The format in which the data will be encoded. It can be either `otlp_json` or `otlp_proto`. Default is `otlp_json` * This field is required and defaults to `otlp_json` ### Adding Destination to Odigos There are two primary methods for configuring destinations in Odigos: ##### **Using the UI** **Step 1** Use the [Odigos CLI](https://docs.odigos.io/cli/odigos_ui) to access the UI ```bash theme={null} odigos ui ``` **Step 2** Click on `Add Destination`, select `AWS S3` and follow the on-screen instructions ##### **Using Kubernetes manifests** **Step 1** Save the YAML below to a file (e.g. `s3.yaml`) ```yaml theme={null} apiVersion: odigos.io/v1alpha1 kind: Destination metadata: name: s3-example namespace: odigos-system spec: data: S3_BUCKET: S3_MARSHALER: '' S3_REGION: '' # Note: The commented fields below are optional. # S3_PARTITION: