From ef65d4b12a5ea849834bcdf847f717c9105c5ec8 Mon Sep 17 00:00:00 2001 From: Weifeng Wang Date: Sat, 16 Mar 2024 00:04:32 +0800 Subject: [PATCH] Docker Compose(profiles): Profiles Ingestion via Labels Signed-off-by: Weifeng Wang update Signed-off-by: Weifeng Wang update docs Signed-off-by: Weifeng Wang update docs Signed-off-by: Weifeng Wang --- .../agent-flow/modules/docker/README.md | 19 + .../modules/docker/profiles/all.river | 27 + .../profiles/profiles-auto-scrape.river | 652 ++++++++++++++++++ .../agent-flow/monolithic-mode-all.river | 39 +- .../common/config/agent-flow/profiles.river | 35 +- .../all-in-one/docker-compose.yaml | 10 + .../profiles/docker-compose.yaml | 8 + 7 files changed, 726 insertions(+), 64 deletions(-) create mode 100644 docker-compose/common/config/agent-flow/modules/docker/profiles/all.river create mode 100644 docker-compose/common/config/agent-flow/modules/docker/profiles/profiles-auto-scrape.river diff --git a/docker-compose/common/config/agent-flow/modules/docker/README.md b/docker-compose/common/config/agent-flow/modules/docker/README.md index a1d0e6fe..790bbc29 100644 --- a/docker-compose/common/config/agent-flow/modules/docker/README.md +++ b/docker-compose/common/config/agent-flow/modules/docker/README.md @@ -39,3 +39,22 @@ The following service labels are supported for gathering of metrics for docker c | `metrics.agent.grafana.com/job`
or
`prometheus.io/job` | The job label value to use when collecting their metrics. However, it is common to use an integration or community project where rules / dashboards are provided for you. Oftentimes, this provided assets use hard-coded values for a job label i.e. `...{job="integrations/kubernetes/cadvisor"...}` or `...{job="minio-job"...}` setting this annotation to that value will allow the provided asset to work out of the box. | | `metrics.agent.grafana.com/interval`
or
`prometheus.io/interval` | The default interval to scrape is `15s`, this can be override. | | `metrics.agent.grafana.com/timeout`
or
`prometheus.io/timeout` | The default timeout for scraping is `10s`, this can be override. | + +--- + +## Profiles + +The following service labels are supported for docker compose services: + +> The full list of profile types supported by labels is `cpu`, `memory`, `goroutine`, `block`, `mutex` and `fgprof`: + +| Label | Description | +| :--------------- | :-----------| +| `profiles.agent.grafana.com/service_name`
or
`profiles.grafana.com/service_name`
or
`pyroscope.io/service_name` | The special label `service_name` is required and must always be present. If it is not specified, will attempt to infer it from either of the following sources. in this order:
  • 1. `__meta_docker_container_label_profiles_agent_grafana_com_service_name` which is a `profiles.agent.grafana.com/service_name` service label
  • 2. `__meta_docker_container_label_profiles_grafana_com_service_name` which is a `profiles.grafana.com/service_name` service label
  • 3. `__meta_docker_container_label_pyroscope_io_service_name` which is a `pyroscope.io/service_name` service label
  • 4. `__meta_docker_container_name`
| +| `profiles.agent.grafana.com/.scrape`
or
`profiles.grafana.com/.scrape` | Boolean whether or not to scrape. (default is `false`).| +| `profiles.agent.grafana.com/.path`
or
`profiles.grafana.com/.path` | The path to the profile type on the target. | +| `profiles.agent.grafana.com/tenant`
or
`profiles.grafana.com/tenant` | The `tenant` to write profile to. default: (.*) | +| `profiles.agent.grafana.com/scheme`
or
`profiles.grafana.com/scheme` | The default scraping scheme is `http`. | +| `profiles.agent.grafana.com/port`
or
`profiles.grafana.com/port` | the default `port` to scrape is the target port, this can be specified as a single value which would override the scrape port being used for all ports attached to the target, note that even if an target had multiple targets, the relabel_config targets are deduped before scraping | +| `profiles.agent.grafana.com/interval`
or
`profiles.grafana.com/interval`| The default `interval` to scrape is `30s`, this can be override. | +| `profiles.agent.grafana.com/timeout`
or
`profiles.grafana.com/timeout` | The default `timeout` for scraping is `15s`, this can be override. | diff --git a/docker-compose/common/config/agent-flow/modules/docker/profiles/all.river b/docker-compose/common/config/agent-flow/modules/docker/profiles/all.river new file mode 100644 index 00000000..ee44cb6a --- /dev/null +++ b/docker-compose/common/config/agent-flow/modules/docker/profiles/all.river @@ -0,0 +1,27 @@ +/* +Module: profiles-all +Description: Wrapper module to include all Docker containers metric modules +*/ +argument "forward_to" { + comment = "Must be a list(profilessReceiver) where collected profiles should be forwarded to" +} + +argument "tenant" { + comment = "The tenant to filter logs to. This does not have to be the tenantId, this is the value to look for in the logs.agent.grafana.com/tenant annotation, and this can be a regex." + optional = true +} + +argument "clustering" { + // Docs: https://grafana.com/docs/agent/latest/flow/concepts/clustering/ + comment = "Whether or not clustering should be enabled (default: true)" +} + +module.file "mf_profiles_auto_scrape" { + filename = coalesce(env("AGENT_CONFIG_FOLDER"), "/etc/agent-config") + "/modules/docker/profiles/profiles-auto-scrape.river" + + arguments { + forward_to = argument.forward_to.value + tenant = coalesce(argument.tenant.value, ".*") + clustering = coalesce(argument.clustering.value, "true") + } +} diff --git a/docker-compose/common/config/agent-flow/modules/docker/profiles/profiles-auto-scrape.river b/docker-compose/common/config/agent-flow/modules/docker/profiles/profiles-auto-scrape.river new file mode 100644 index 00000000..51afb148 --- /dev/null +++ b/docker-compose/common/config/agent-flow/modules/docker/profiles/profiles-auto-scrape.river @@ -0,0 +1,652 @@ +/* +Module(profiles): Docker Containers Auto-Scraping +Description: Scrapes targets for profiles based on Docker Containers labels + +Note: Every argument except for "forward_to" is optional, and does have a defined default value. However, the values for these + arguments are not defined using the default = " ... " argument syntax, but rather using the coalesce(argument.value, " ... "). + This is because if the argument passed in from another consuming module is set to null, the default = " ... " syntax will + does not override the value passed in, where coalesce() will return the first non-null value. + + +The full list of profile types supported by labels is "cpu", "memory", "goroutine", "block", "mutex" and "fgprof" + +For example the following labels: + + ``` + profiles.agent.grafana.com/.scrape: true + profiles.agent.grafana.com/.path: /path/to + profiles.agent.grafana.com/service_name: pyroscope + profiles.agent.grafana.com/tenant: primary + profiles.agent.grafana.com/scheme: http + profiles.agent.grafana.com/port: 8080 + profiles.agent.grafana.com/interval: 30s + profiles.agent.grafana.com/timeout: 15s +or + profiles.agent.grafana.com/.scrape: true + profiles.agent.grafana.com/.path: /path/to + profiles.agent.grafana.com/service_name: pyroscope + profiles.agent.grafana.com/tenant: primary + profiles.agent.grafana.com/scheme: http + profiles.agent.grafana.com/port: 8080 + profiles.agent.grafana.com/interval: 30s + profiles.agent.grafana.com/timeout: 15s + ``` +*/ +argument "forward_to" { + comment = "Must be a list(ProfilessReceiver) where collected profile should be forwarded to" +} + +argument "cluster" { + optional = true +} + +argument "namespace" { + optional = true +} + +argument "tenant" { + comment = "The tenant to write profile to. This does not have to be the tenantId, this is the value to look for in the logs.agent.grafana.com/tenant label, and this can be a regex. (default: (.*))" + optional = true +} + +argument "scrape_interval" { + comment = "How often to scrape profile from the targets (default: 30s)" + optional = true +} + +argument "scrape_timeout" { + comment = "How long before a scrape times out (default: 15s)" + optional = true +} + +argument "clustering" { + // Docs: https://grafana.com/docs/agent/latest/flow/concepts/clustering/ + comment = "Whether or not clustering should be enabled (default: false)" + optional = true +} + +// get the available containers. +discovery.docker "dd_profiles" { + host = "unix:///var/run/docker.sock" + refresh_interval = "15s" + + filter { + name = "status" + values = ["running"] + } +} + +discovery.relabel "dr_docker_profiles" { + targets = discovery.docker.dd_profiles.targets + + // allow resources to declare the protocol to use when collecting profiles + // default value is "http" + rule { + action = "replace" + replacement = "http" + target_label = "__scheme__" + } + + rule { + action = "replace" + source_labels = [ + "__meta_docker_container_label_profiles_agent_grafana_com_scheme", + "__meta_docker_container_label_profiles_grafana_com_scheme", + ] + separator = ";" + regex = "^(?:;*)?(https?).*$" + replacement = "$1" + target_label = "__scheme__" + } + + rule { + action = "replace" + source_labels = [ + "__meta_docker_container_label_profiles_agent_grafana_com_port", + "__meta_docker_container_label_profiles_grafana_com_port", + ] + separator = ";" + regex = "^(?:;*)?(\\d+).*$" + replacement = "$1" + target_label = "__tmp_port" + } + + rule { + action = "replace" + source_labels = [ + "__address__", + "__tmp_port", + ] + separator = ";" + regex = "^([^:]+)(?::\\d+)?;(\\d+)$" + replacement = "$1:$2" + target_label = "__address__" + } + + // allow resources to declare their profiles should be sent to + rule { + action = "keep" + source_labels = [ + "__meta_docker_container_label_profiles_agent_grafana_com_tenant", + "__meta_docker_container_label_profiles_grafana_com_tenant", + ] + regex = "^(" + coalesce(argument.tenant.value, ".*") + ")$" + } + + // allow resources to declare how often their profiles should be collected. + // default value is 30s, the following duration formats are supported (s|m|ms|h|d) + rule { + action = "replace" + replacement = coalesce(argument.scrape_interval.value, "30s") + target_label = "__scrape_interval__" + } + + rule { + action = "replace" + source_labels = [ + "__meta_docker_container_label_profiles_agent_grafana_com_interval", + "__meta_docker_container_label_profiles_grafana_com_interval", + ] + separator = ";" + regex = "^(?:;*)?(\\d+(s|m|ms|h|d)).*$" + replacement = "$1" + target_label = "__scrape_interval__" + } + + // allow resources to declare the timeout of the scrape request + // default value is 15s, the following duration formats are supported (s|m|ms|h|d) + rule { + action = "replace" + replacement = coalesce(argument.scrape_timeout.value, "15s") + target_label = "__scrape_timeout__" + } + + rule { + action = "replace" + source_labels = [ + "__meta_docker_container_label_profiles_agent_grafana_com_interval", + "__meta_docker_container_label_profiles_grafana_com_interval", + ] + separator = ";" + regex = "^(?:;*)?(\\d+(s|m|ms|h|d)).*$" + replacement = "$1" + target_label = "__scrape_timeout__" + } + + /******************************************** + * Handle Setting Common Labels + ********************************************/ + + // set the cluster label + rule { + action = "replace" + replacement = coalesce(argument.cluster.value, "docker-compose") + target_label = "cluster" + } + + // set the namespace label + rule { + action = "replace" + replacement = coalesce(argument.namespace.value, "monitoring-system") + target_label = "namespace" + } + + // set a default job label to be the namespace/docker_compose_service + rule { + action = "replace" + source_labels = [ + "__meta_docker_container_label_com_docker_compose_service", + ] + regex = "^(?:;*)?([^;]+).*$" + replacement = coalesce(argument.namespace.value, "monitoring-system") + "/$1" + target_label = "job" + } + + rule { + action = "replace" + source_labels = [ + "__meta_docker_container_label_com_docker_compose_service", + ] + regex = "^(?:;*)?([^;]+).*$" + replacement = "$1" + target_label = "pod" + } + + rule { + source_labels = ["__meta_docker_container_name"] + regex = "/(.*)" + target_label = "container" + } + + rule { + action = "replace" + source_labels = [ + "__meta_docker_container_label_com_docker_compose_service", + ] + regex = "^(?:;*)?([^;]+).*$" + replacement = "$1" + target_label = "app" + } + + rule { + action = "replace" + source_labels = [ + "__meta_docker_container_label_com_docker_compose_service", + ] + regex = "^(?:;*)?([^;]+).*$" + replacement = "$1" + target_label = "service_name" + } + + rule { + action = "replace" + source_labels = [ + "__meta_docker_container_label_app", + ] + regex = "^(?:;*)?([^;]+).*$" + replacement = "$1" + target_label = "app" + } + + rule { + action = "replace" + source_labels = [ + "__meta_docker_container_label_profiles_agent_grafana_com_service_name", + "__meta_docker_container_label_profiles_grafana_com_service_name", + "__meta_docker_container_label_pyroscope_io_service_name", + ] + regex = "^(?:;*)?([^;]+).*$" + replacement = "$1" + target_label = "service_name" + } +} + +/******************************************** + * Pyroscope Scrape CPU + ********************************************/ +discovery.relabel "dr_keep_cpu_targets" { + targets = discovery.relabel.dr_docker_profiles.output + + rule { + action = "keep" + source_labels = [ + "__meta_docker_container_label_profiles_agent_grafana_com_cpu_scrape", + "__meta_docker_container_label_profiles_grafana_com_cpu_scrape", + ] + regex = "^(?:;*)?(true).*$" + } + + rule { + action = "replace" + source_labels = [ + "__meta_docker_container_label_profiles_agent_grafana_com_cpu_path", + "__meta_docker_container_label_profiles_grafana_com_cpu_path", + ] + separator = ";" + regex = "^(?:;*)?([^;]+).*$" + replacement = "$1" + target_label = "__profile_path__" + } +} + +pyroscope.scrape "ps_profile_cpu" { + forward_to = argument.forward_to.value + + job_name = "label-profiles-cpu" + targets = discovery.relabel.dr_keep_cpu_targets.output + + clustering { + enabled = coalesce(argument.clustering.value, true) + } + + profiling_config { + profile.process_cpu { + enabled = true + } + + profile.memory { + enabled = false + } + + profile.goroutine { + enabled = false + } + + profile.block { + enabled = false + } + + profile.mutex { + enabled = false + } + + profile.fgprof { + enabled = false + } + } +} + +/******************************************** + * Pyroscope Scrape Memory + ********************************************/ +discovery.relabel "dr_keep_memory_targets" { + targets = discovery.relabel.dr_docker_profiles.output + + rule { + action = "keep" + source_labels = [ + "__meta_docker_container_label_profiles_agent_grafana_com_memory_scrape", + "__meta_docker_container_label_profiles_grafana_com_memory_scrape", + ] + regex = "^(?:;*)?(true).*$" + } + + rule { + action = "replace" + source_labels = [ + "__meta_docker_container_label_profiles_agent_grafana_com_memory_path", + "__meta_docker_container_label_profiles_grafana_com_memory_path", + ] + separator = ";" + regex = "^(?:;*)?([^;]+).*$" + replacement = "$1" + target_label = "__profile_path__" + } +} + +pyroscope.scrape "ps_profile_memory" { + forward_to = argument.forward_to.value + + job_name = "label-profiles-memory" + targets = discovery.relabel.dr_keep_memory_targets.output + + clustering { + enabled = coalesce(argument.clustering.value, true) + } + + profiling_config { + profile.process_cpu { + enabled = false + } + + profile.memory { + enabled = true + } + + profile.goroutine { + enabled = false + } + + profile.block { + enabled = false + } + + profile.mutex { + enabled = false + } + + profile.fgprof { + enabled = false + } + } +} + +/******************************************** + * Pyroscope Scrape Goroutine + ********************************************/ +discovery.relabel "dr_keep_goroutine_targets" { + targets = discovery.relabel.dr_docker_profiles.output + + rule { + action = "keep" + source_labels = [ + "__meta_docker_container_label_profiles_agent_grafana_com_goroutine_scrape", + "__meta_docker_container_label_profiles_grafana_com_goroutine_scrape", + ] + regex = "^(?:;*)?(true).*$" + } + + rule { + action = "replace" + source_labels = [ + "__meta_docker_container_label_profiles_agent_grafana_com_goroutine_path", + "__meta_docker_container_label_profiles_grafana_com_goroutine_path", + ] + separator = ";" + regex = "^(?:;*)?([^;]+).*$" + replacement = "$1" + target_label = "__profile_path__" + } +} + +pyroscope.scrape "ps_profile_goroutine" { + forward_to = argument.forward_to.value + + job_name = "label-profiles-goroutine" + targets = discovery.relabel.dr_keep_goroutine_targets.output + + clustering { + enabled = coalesce(argument.clustering.value, true) + } + + profiling_config { + profile.process_cpu { + enabled = false + } + + profile.memory { + enabled = false + } + + profile.goroutine { + enabled = true + } + + profile.block { + enabled = false + } + + profile.mutex { + enabled = false + } + + profile.fgprof { + enabled = false + } + } +} + +/******************************************** + * Pyroscope Scrape Block + ********************************************/ +discovery.relabel "dr_keep_block_targets" { + targets = discovery.relabel.dr_docker_profiles.output + + rule { + action = "keep" + source_labels = [ + "__meta_docker_container_label_profiles_agent_grafana_com_block_scrape", + "__meta_docker_container_label_profiles_grafana_com_block_scrape", + ] + regex = "^(?:;*)?(true).*$" + } + + rule { + action = "replace" + source_labels = [ + "__meta_docker_container_label_profiles_agent_grafana_com_block_path", + "__meta_docker_container_label_profiles_grafana_com_block_path", + ] + separator = ";" + regex = "^(?:;*)?([^;]+).*$" + replacement = "$1" + target_label = "__profile_path__" + } +} + +pyroscope.scrape "ps_profile_block" { + forward_to = argument.forward_to.value + + job_name = "label-profiles-block" + targets = discovery.relabel.dr_keep_block_targets.output + + clustering { + enabled = coalesce(argument.clustering.value, true) + } + + profiling_config { + profile.process_cpu { + enabled = false + } + + profile.memory { + enabled = false + } + + profile.goroutine { + enabled = false + } + + profile.block { + enabled = true + } + + profile.mutex { + enabled = false + } + + profile.fgprof { + enabled = false + } + } +} + +/******************************************** + * Pyroscope Scrape Mutex + ********************************************/ +discovery.relabel "dr_keep_mutex_targets" { + targets = discovery.relabel.dr_docker_profiles.output + + rule { + action = "keep" + source_labels = [ + "__meta_docker_container_label_profiles_agent_grafana_com_mutex_scrape", + "__meta_docker_container_label_profiles_grafana_com_mutex_scrape", + ] + regex = "^(?:;*)?(true).*$" + } + + rule { + action = "replace" + source_labels = [ + "__meta_docker_container_label_profiles_agent_grafana_com_mutex_path", + "__meta_docker_container_label_profiles_grafana_com_mutex_path", + ] + separator = ";" + regex = "^(?:;*)?([^;]+).*$" + replacement = "$1" + target_label = "__profile_path__" + } +} + +pyroscope.scrape "ps_profile_mutex" { + forward_to = argument.forward_to.value + + job_name = "label-profiles-mutex" + targets = discovery.relabel.dr_keep_mutex_targets.output + + clustering { + enabled = coalesce(argument.clustering.value, true) + } + + profiling_config { + profile.process_cpu { + enabled = false + } + + profile.memory { + enabled = false + } + + profile.goroutine { + enabled = false + } + + profile.block { + enabled = false + } + + profile.mutex { + enabled = true + } + + profile.fgprof { + enabled = false + } + } +} + +/******************************************** + * Pyroscope Scrape Fgprof + ********************************************/ +discovery.relabel "dr_keep_fgprof_targets" { + targets = discovery.relabel.dr_docker_profiles.output + + rule { + action = "keep" + source_labels = [ + "__meta_docker_container_label_profiles_agent_grafana_com_fgprof_scrape", + "__meta_docker_container_label_profiles_grafana_com_fgprof_scrape", + ] + regex = "^(?:;*)?(true).*$" + } + + rule { + action = "replace" + source_labels = [ + "__meta_docker_container_label_profiles_agent_grafana_com_fgprof_path", + "__meta_docker_container_label_profiles_grafana_com_fgprof_path", + ] + separator = ";" + regex = "^(?:;*)?([^;]+).*$" + replacement = "$1" + target_label = "__profile_path__" + } +} + +pyroscope.scrape "ps_profile_fgprof" { + forward_to = argument.forward_to.value + + job_name = "label-profiles-fgprof" + targets = discovery.relabel.dr_keep_fgprof_targets.output + + clustering { + enabled = coalesce(argument.clustering.value, true) + } + + profiling_config { + profile.process_cpu { + enabled = false + } + + profile.memory { + enabled = false + } + + profile.goroutine { + enabled = false + } + + profile.block { + enabled = false + } + + profile.mutex { + enabled = false + } + + profile.fgprof { + enabled = true + } + } +} diff --git a/docker-compose/common/config/agent-flow/monolithic-mode-all.river b/docker-compose/common/config/agent-flow/monolithic-mode-all.river index c1c319f7..7ebb3626 100644 --- a/docker-compose/common/config/agent-flow/monolithic-mode-all.river +++ b/docker-compose/common/config/agent-flow/monolithic-mode-all.river @@ -245,40 +245,11 @@ loki.process "autologging" { * Profiles ********************************************/ -pyroscope.scrape "containers" { - targets = [ - // {"__address__" = "agent:12345", "service_name" = "agent"}, - {"__address__" = "loki:3100", "service_name" = "loki"}, - // {"__address__" = "grafana:6060", "service_name" = "grafana"}, - // {"__address__" = "mimir:8080", "service_name" = "mimir"}, - {"__address__" = "tempo:3200", "service_name" = "tempo"}, - ] - - clustering { - enabled = true - } - - profiling_config { - profile.block { - enabled = true - } - - profile.mutex { - enabled = true - } - - profile.memory { - enabled = true - } +module.file "profiles_primary" { + filename = coalesce(env("AGENT_CONFIG_FOLDER"), "/etc/agent-config") + "/modules/docker/profiles/all.river" - profile.goroutine { - enabled = true - } - - profile.process_cpu { - enabled = true - } + arguments { + forward_to = [module.file.docker_compose.exports.profiles_receiver] + clustering = true } - - forward_to = [module.file.docker_compose.exports.profiles_receiver] } diff --git a/docker-compose/common/config/agent-flow/profiles.river b/docker-compose/common/config/agent-flow/profiles.river index c0d87c5c..874bda23 100644 --- a/docker-compose/common/config/agent-flow/profiles.river +++ b/docker-compose/common/config/agent-flow/profiles.river @@ -21,36 +21,11 @@ module.file "docker_compose" { * Profiles ********************************************/ -pyroscope.scrape "containers" { - targets = [ - {"__address__" = "grafana:6060", "service_name" = "grafana"}, - ] +module.file "profiles_primary" { + filename = coalesce(env("AGENT_CONFIG_FOLDER"), "/etc/agent-config") + "/modules/docker/profiles/all.river" - clustering { - enabled = true - } - - profiling_config { - profile.block { - enabled = true - } - - profile.mutex { - enabled = true - } - - profile.memory { - enabled = true - } - - profile.goroutine { - enabled = true - } - - profile.process_cpu { - enabled = true - } + arguments { + forward_to = [module.file.docker_compose.exports.profiles_receiver] + clustering = true } - - forward_to = [module.file.docker_compose.exports.profiles_receiver] } diff --git a/docker-compose/monolithic-mode/all-in-one/docker-compose.yaml b/docker-compose/monolithic-mode/all-in-one/docker-compose.yaml index 34d2f9fb..1f70dfc0 100644 --- a/docker-compose/monolithic-mode/all-in-one/docker-compose.yaml +++ b/docker-compose/monolithic-mode/all-in-one/docker-compose.yaml @@ -85,8 +85,13 @@ services: rules load agent-flow-mixin-alerts.yaml /loki-mixin-rules.yaml /loki-mixin-alerts.yaml /memcached-mixin-alerts.yaml /mimir-mixin-rules.yaml /mimir-mixin-alerts.yaml /pyroscope-mixin-rules.yaml loki: + # https://github.com/qclaogui/codelab-monitoring/blob/main/docker-compose/common/config/agent-flow/modules/docker/README.md labels: - logs.agent.grafana.com/log-format=json + - profiles.agent.grafana.com/cpu.scrape=true + - profiles.agent.grafana.com/memory.scrape=true + - profiles.agent.grafana.com/goroutine.scrape=true + - profiles.agent.grafana.com/service_name=loki depends_on: minio: condition: service_healthy @@ -116,8 +121,13 @@ services: - loki-memberlist tempo: + # https://github.com/qclaogui/codelab-monitoring/blob/main/docker-compose/common/config/agent-flow/modules/docker/README.md labels: - logs.agent.grafana.com/log-format=logfmt + - profiles.agent.grafana.com/cpu.scrape=true + - profiles.agent.grafana.com/memory.scrape=true + - profiles.agent.grafana.com/goroutine.scrape=true + - profiles.agent.grafana.com/service_name=tempo depends_on: minio: condition: service_healthy diff --git a/docker-compose/monolithic-mode/profiles/docker-compose.yaml b/docker-compose/monolithic-mode/profiles/docker-compose.yaml index 5b8bb109..69b1065a 100644 --- a/docker-compose/monolithic-mode/profiles/docker-compose.yaml +++ b/docker-compose/monolithic-mode/profiles/docker-compose.yaml @@ -54,6 +54,14 @@ services: retries: 5 grafana: + # https://github.com/qclaogui/codelab-monitoring/blob/main/docker-compose/common/config/agent-flow/modules/docker/README.md + labels: + - logs.agent.grafana.com/log-format=logfmt + - profiles.agent.grafana.com/cpu.scrape=true + - profiles.agent.grafana.com/memory.scrape=true + - profiles.agent.grafana.com/goroutine.scrape=true + - profiles.agent.grafana.com/service_name=grafana + - profiles.agent.grafana.com/port=6060 image: ${GRAFANA_IMAGE:-docker.io/grafana/grafana:latest} hostname: grafana command: