11
2- // Enable this config by setting the env var ALLOY_FILE_NAME to cloud-otel.alloy for the docker-compose-cloud.yaml
3-
42import.git "grafana_cloud" {
53 repository = "https://github.com/grafana/alloy-modules.git"
64 revision = "main"
75 path = "modules/cloud/grafana/cloud/module.alloy"
8- pull_frequency = "24h "
6+ pull_frequency = "0s "
97}
8+
109grafana_cloud.stack "receivers" {
1110 stack_name = env("GRAFANA_CLOUD_STACK")
1211 token = env("GRAFANA_CLOUD_TOKEN")
1312}
1413
15- otelcol.auth.basic "grafana_cloud" {
16- username = grafana_cloud.stack.receivers.info["htInstanceId"]
17- password = env("GRAFANA_CLOUD_TOKEN")
18- }
19-
20- otelcol.exporter.otlphttp "grafana_cloud" {
21- client {
22- endpoint = grafana_cloud.stack.receivers.info["htInstanceUrl"] + ":443"
23- auth = otelcol.auth.basic.grafana_cloud.handler
24- }
25- }
26-
27-
28- discovery.docker "all_containers" {
14+ // discover containers running QuickPizza
15+ discovery.docker "application_containers" {
2916 host = "unix:///var/run/docker.sock"
17+ filter {
18+ name = "label"
19+ values = ["service.type=application"]
20+ }
3021}
3122
32- discovery.relabel "relabel_targets" {
23+ // set expected labels
24+ discovery.relabel "application_containers" {
25+ rule {
26+ target_label = "job"
27+ source_labels = [
28+ "__meta_docker_container_name",
29+ ]
30+ regex = "/(.*)"
31+ replacement = "quickpizza/${1}"
32+ }
3333 rule {
3434 target_label = "instance"
3535 source_labels = [
3636 "__meta_docker_container_name",
3737 ]
38- regex ="/(.*)"
39- action = "replace "
38+ regex = "/(.*)"
39+ replacement = "${1} "
4040 }
4141 rule {
42- target_label = "job"
42+ target_label = "service_namespace"
43+ replacement = "quickpizza"
44+ }
45+ // the `namespace` label is for visualizing Profiles in Application Observability
46+ rule {
47+ target_label = "namespace"
48+ replacement = "quickpizza"
49+ }
50+ rule {
51+ target_label = "service_name"
4352 source_labels = [
44- "__meta_docker_container_label_com_docker_compose_project ",
53+ "__meta_docker_container_name ",
4554 ]
46- regex = ".*quickpizza.* "
47- action = "keep "
55+ regex = "/(.*) "
56+ replacement = "${1} "
4857 }
49- targets = discovery.docker.all_containers .targets
58+ targets = discovery.docker.application_containers .targets
5059}
5160
52-
5361// Metrics
54- prometheus.scrape "default" {
62+ prometheus.scrape "application_containers" {
63+ scrape_interval = "10s"
64+ targets = discovery.relabel.application_containers.output
5565 forward_to = [grafana_cloud.stack.receivers.metrics]
56- targets = discovery.relabel.relabel_targets.output
5766}
58-
59- loki.source.docker "default " {
67+ // Logs
68+ loki.source.docker "application_containers " {
6069 host = "unix:///var/run/docker.sock"
61- targets = discovery.relabel.relabel_targets .output
70+ targets = discovery.relabel.application_containers .output
6271 forward_to = [grafana_cloud.stack.receivers.logs]
63- labels = {
64- service_name = "quickpizza",
65- service_namespace = "quickpizza",
66- }
6772}
6873
69- pyroscope.scrape "scrape_profiles" {
74+ // Profiling Pull Mode
75+ pyroscope.scrape "application_containers" {
76+ // https://grafana.com/docs/pyroscope/latest/configure-client/grafana-alloy/go_pull/
77+ scrape_interval = "30s"
78+ targets = discovery.relabel.application_containers.output
7079 forward_to = [grafana_cloud.stack.receivers.profiles]
71- targets = discovery.relabel.relabel_targets.output
72- }
73-
74- pyroscope.receive_http "default" {
75- forward_to = [grafana_cloud.stack.receivers.profiles]
76- http {
77- listen_address = "0.0.0.0"
78- listen_port = 9999
79- }
8080}
8181
82-
82+ // Traces
8383otelcol.receiver.otlp "default" {
8484 // https://grafana.com/docs/alloy/latest/reference/components/otelcol.receiver.otlp/
8585
@@ -172,7 +172,6 @@ otelcol.processor.transform "drop_unneeded_resource_attributes" {
172172otelcol.connector.host_info "default" {
173173 // https://grafana.com/docs/alloy/latest/reference/components/otelcol.connector.host_info/
174174 host_identifiers = ["container.name", "container.id", "service.name"]
175- metrics_flush_interval = "10s"
176175
177176 output {
178177 metrics = [otelcol.processor.batch.default.input]
@@ -195,16 +194,26 @@ otelcol.processor.transform "add_resource_attributes_as_metric_attributes" {
195194 metrics = [otelcol.processor.batch.default.input]
196195 }
197196}
198-
197+
199198otelcol.processor.batch "default" {
200199 // https://grafana.com/docs/alloy/latest/reference/components/otelcol.processor.batch/
201200 output {
202201 metrics = [otelcol.exporter.otlphttp.grafana_cloud.input]
203202 logs = [otelcol.exporter.otlphttp.grafana_cloud.input]
204- // traces = [otelcol.exporter.otlphttp.grafana_cloud.input]
205-
206- //metrics = [grafana_cloud.stack.receivers.metrics]
207- //logs = [grafana_cloud.stack.receivers.logs]
208- traces = [grafana_cloud.stack.receivers.traces]
203+ traces = [otelcol.exporter.otlphttp.grafana_cloud.input]
209204 }
210205}
206+
207+ otelcol.auth.basic "grafana_cloud" {
208+ // TODO: Fix info["htInstanceId"] not working, and need to pass GRAFANA_CLOUD_INSTANCE_ID.
209+ //username = grafana_cloud.stack.receivers.info["htInstanceId"]
210+ username = env("GRAFANA_CLOUD_INSTANCE_ID")
211+ password = env("GRAFANA_CLOUD_TOKEN")
212+ }
213+
214+ otelcol.exporter.otlphttp "grafana_cloud" {
215+ client {
216+ endpoint = env("GRAFANA_CLOUD_OTLP_ENDPOINT")
217+ auth = otelcol.auth.basic.grafana_cloud.handler
218+ }
219+ }
0 commit comments