---
title: "Set up Grafana Alloy for Application Observability | OpenTelemetry documentation"
description: "Set up Grafana Alloy, an OpenTelemetry Collector distribution, for Application Observability."
---

# Set up Grafana Alloy for Application Observability

Grafana Labs recommends using Grafana Alloy, an OpenTelemetry Collector distribution, for production observability. Alloy packages upstream OpenTelemetry Collector components and Prometheus exporters to provide stability, support, and seamless integration with Grafana Application Observability and other Grafana products.

## Recommended setup

For production, run Alloy on every host to enable seamless correlation between infrastructure and application observability data.

Instrument your applications using the **OpenTelemetry (OTLP)** with Grafana Alloy [Grafana Cloud integration tile](/docs/grafana-cloud/send-data/otlp/send-data-otlp/#recommended-opentelemetry-setup-via-grafana-cloud-integrations). This approach provides all binaries, configuration, and connection parameters needed to set up OpenTelemetry and Application Observability.

If you already run Alloy on each host, see the [configure your application](#configure-your-application) section.

## Advanced manual setup

For advanced use cases, manually configure the Alloy `alloy-config.river` configuration file:

Alloy ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```alloy
otelcol.receiver.otlp "default" {
	// https://grafana.com/docs/alloy/latest/reference/components/otelcol.receiver.otlp/

	// configures the default grpc endpoint "0.0.0.0:4317"
	grpc { }
	// configures the default http/protobuf endpoint "0.0.0.0:4318"
	http { }

	output {
		metrics = [otelcol.processor.resourcedetection.default.input]
		logs    = [otelcol.processor.resourcedetection.default.input]
		traces  = [otelcol.processor.resourcedetection.default.input]
	}
}

otelcol.processor.resourcedetection "default" {
	// https://grafana.com/docs/alloy/latest/reference/components/otelcol.processor.resourcedetection/
	detectors = ["env", "system"] // add "gcp", "ec2", "ecs", "elastic_beanstalk", "eks", "lambda", "azure", "aks", "consul", "heroku"  if you want to use cloud resource detection

	system {
		hostname_sources = ["os"]
	}

	output {
		metrics = [otelcol.processor.transform.drop_unneeded_resource_attributes.input]
		logs    = [otelcol.processor.transform.drop_unneeded_resource_attributes.input]
		traces  = [otelcol.processor.transform.drop_unneeded_resource_attributes.input]
	}
}

otelcol.processor.transform "drop_unneeded_resource_attributes" {
	// https://grafana.com/docs/alloy/latest/reference/components/otelcol.processor.transform/
	error_mode = "ignore"

	trace_statements {
		context    = "resource"
		statements = [
			"delete_key(attributes, \"k8s.pod.start_time\")",
			"delete_key(attributes, \"os.description\")",
			"delete_key(attributes, \"os.type\")",
			"delete_key(attributes, \"process.command_args\")",
			"delete_key(attributes, \"process.executable.path\")",
			"delete_key(attributes, \"process.pid\")",
			"delete_key(attributes, \"process.runtime.description\")",
			"delete_key(attributes, \"process.runtime.name\")",
			"delete_key(attributes, \"process.runtime.version\")",
		]
	}

	metric_statements {
		context    = "resource"
		statements = [
			"delete_key(attributes, \"k8s.pod.start_time\")",
			"delete_key(attributes, \"os.description\")",
			"delete_key(attributes, \"os.type\")",
			"delete_key(attributes, \"process.command_args\")",
			"delete_key(attributes, \"process.executable.path\")",
			"delete_key(attributes, \"process.pid\")",
			"delete_key(attributes, \"process.runtime.description\")",
			"delete_key(attributes, \"process.runtime.name\")",
			"delete_key(attributes, \"process.runtime.version\")",
		]
	}

	log_statements {
		context    = "resource"
		statements = [
			"delete_key(attributes, \"k8s.pod.start_time\")",
			"delete_key(attributes, \"os.description\")",
			"delete_key(attributes, \"os.type\")",
			"delete_key(attributes, \"process.command_args\")",
			"delete_key(attributes, \"process.executable.path\")",
			"delete_key(attributes, \"process.pid\")",
			"delete_key(attributes, \"process.runtime.description\")",
			"delete_key(attributes, \"process.runtime.name\")",
			"delete_key(attributes, \"process.runtime.version\")",
		]
	}

	output {
		metrics = [otelcol.processor.transform.add_resource_attributes_as_metric_attributes.input]
		logs    = [otelcol.processor.batch.default.input]
		traces  = [
			otelcol.processor.batch.default.input,
			otelcol.connector.host_info.default.input,
		]
	}
}

otelcol.connector.host_info "default" {
	// https://grafana.com/docs/alloy/latest/reference/components/otelcol.connector.host_info/
	host_identifiers = ["host.name"]

	output {
		metrics = [otelcol.processor.batch.default.input]
	}
}

otelcol.processor.transform "add_resource_attributes_as_metric_attributes" {
	// https://grafana.com/docs/alloy/latest/reference/components/otelcol.processor.transform/
	error_mode = "ignore"

	metric_statements {
		context    = "datapoint"
		statements = [
			"set(attributes[\"deployment.environment\"], resource.attributes[\"deployment.environment\"])",
			"set(attributes[\"service.version\"], resource.attributes[\"service.version\"])",
		]
	}

	output {
		metrics = [otelcol.processor.batch.default.input]
	}
}

otelcol.processor.batch "default" {
	// https://grafana.com/docs/alloy/latest/reference/components/otelcol.processor.batch/
	output {
		metrics = [otelcol.exporter.otlphttp.grafana_cloud.input]
		logs    = [otelcol.exporter.otlphttp.grafana_cloud.input]
		traces  = [otelcol.exporter.otlphttp.grafana_cloud.input]
	}
}

otelcol.exporter.otlphttp "grafana_cloud" {
	// https://grafana.com/docs/alloy/latest/reference/components/otelcol.exporter.otlphttp/
	client {
		endpoint = env("GRAFANA_CLOUD_OTLP_ENDPOINT")
		auth     = otelcol.auth.basic.grafana_cloud.handler
	}
}

otelcol.auth.basic "grafana_cloud" {
	// https://grafana.com/docs/alloy/latest/reference/components/otelcol.auth.basic/
	username = env("GRAFANA_CLOUD_INSTANCE_ID")
	password = env("GRAFANA_CLOUD_API_KEY")
}
```

Set the following environment variables in your configuration file:

Expand table

| Environment Variable          | Description                                                                | Example                                      |
|-------------------------------|----------------------------------------------------------------------------|----------------------------------------------|
| `GRAFANA_CLOUD_API_KEY`       | API key generated above                                                    | `eyJvSomeLongStringJ9fQ==`                   |
| `GRAFANA_CLOUD_OTLP_ENDPOINT` | **OTLP endpoint** from **Grafana Cloud &gt; OpenTelemetry &gt; Configure** | `https://otlp-endpoint-***.grafana.net/otlp` |
| `GRAFANA_CLOUD_INSTANCE_ID`   | **Instance ID** from **Grafana Cloud &gt; OpenTelemetry &gt; Configure**   | `11111`                                      |

## Run Grafana Alloy

Create the `alloy-config.river` configuration file, set the required environment variables, and [run Grafana Alloy](/docs/alloy/latest/set-up/run/).

## Configure your application

Set the following environment variables to configure your application to use Alloy:

Expand table

| Configuration                                   | Options                                      | Result                                                   |
|-------------------------------------------------|----------------------------------------------|----------------------------------------------------------|
| `export OTEL_EXPORTER_OTLP_ENDPOINT=<host>`     | `http://localhost:4318`, remote host address | The default local host address or a remote host address. |
| `export OTEL_EXPORTER_OTLP_PROTOCOL=<protocol>` | `grpc`, `http/protobuf`                      | The default `http/protobuf` protocol or `grpc`.          |

For example, to use a local Grafana Alloy, set:

shell ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```shell
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
export OTEL_EXPORTER_OTLP_PROTOCOL=grpc
```

Then restart your application.

## Resource

Refer to the [Alloy `otelcol` components documentation](/docs/alloy/latest/reference/components/otelcol/) and specifically the [`otelcol.exporter.otlp` component documentation](/docs/alloy/latest/reference/components/otelcol/otelcol.exporter.otlp/) for more information on configuring Alloy.

## Next steps

[Observe your services in Application Observability](/docs/grafana-cloud/monitor-applications/application-observability/manual/)
