From ad99e54467df3e66cfbd0e9aceb2b7a467065200 Mon Sep 17 00:00:00 2001 From: Piotr <17101802+thampiotr@users.noreply.github.com> Date: Wed, 26 Feb 2025 15:30:47 +0000 Subject: [PATCH] v1.7.1 prep of release branch (#2848) * fix targets conversion to maps for some components (#2834) * update to latest walqueue (#2845) * update to latest walqueue * fix typo * fix typo * Update ckit dependency (#2847) * changelog fix --------- Co-authored-by: mattdurham Co-authored-by: Sam DeHaan --- CHANGELOG.md | 10 +++ .../prometheus/prometheus.write.queue.md | 6 ++ go.mod | 19 ++--- go.sum | 36 +++++---- .../component/discovery/discovery_test.go | 8 +- internal/component/discovery/target.go | 19 ++++- .../component/discovery/target_builder.go | 8 +- internal/component/discovery/target_test.go | 81 +++++++++++++++---- .../prometheus/write/queue/component.go | 11 ++- 9 files changed, 144 insertions(+), 54 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf25a433f4..6b7368a450 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,16 @@ This document contains a historical list of changes between releases. Only changes that impact end-user behavior are listed; changes to documentation or internal API changes are not present. +v1.7.1 +----------------- + +### Bugfixes + +- Fixed an issue where some exporters such as `prometheus.exporter.snmp` couldn't accept targets from other components + with an error `conversion to '*map[string]string' is not supported"`. (@thampiotr) + +- Enable batching of calls to the appender in `prometheus.write.queue` to reduce lock contention when scraping, which + will lead to reduced scrape duration. (@mattdurham) v1.7.0 ----------------- diff --git a/docs/sources/reference/components/prometheus/prometheus.write.queue.md b/docs/sources/reference/components/prometheus/prometheus.write.queue.md index 280a080407..1a6bd55576 100644 --- a/docs/sources/reference/components/prometheus/prometheus.write.queue.md +++ b/docs/sources/reference/components/prometheus/prometheus.write.queue.md @@ -181,6 +181,12 @@ They generally behave the same, but there are likely edge cases where they diffe * `prometheus_remote_write_wal_samples_appended_total` (counter): Total number of samples appended to the WAL. * `prometheus_remote_write_wal_storage_created_series_total` (counter): Total number of created series appended to the WAL. * `prometheus_remote_write_wal_storage_removed_series_total` (counter): Total number of series removed from the WAL. +* `prometheus_remote_storage_bytes_total` (counter): Total number of bytes of data sent by queues after compression. +* `prometheus_remote_storage_sent_bytes_total` (counter): Total number of bytes of data sent by queues after compression. (same as `prometheus_remote_storage_bytes_total`) +* `prometheus_remote_storage_sent_batch_duration_seconds` (histogram): Duration of send calls to remote storage. +* `prometheus_remote_storage_shards_max` (gauge): The maximum number of a shards a queue is allowed to run. +* `prometheus_remote_storage_shards_min` (gauge): The minimum number of shards a queue is allowed to run. +* `prometheus_remote_storage_shards` (gauge): The number of shards used for concurrent delivery of metrics to an endpoint. Metrics that are new to `prometheus.write.queue`. These are highly subject to change. diff --git a/go.mod b/go.mod index d3ec33ab3f..99afe485b7 100644 --- a/go.mod +++ b/go.mod @@ -59,7 +59,7 @@ require ( github.com/grafana/alloy-remote-config v0.0.10 github.com/grafana/alloy/syntax v0.1.0 github.com/grafana/catchpoint-prometheus-exporter v0.0.0-20250218151502-6e97feaee761 - github.com/grafana/ckit v0.0.0-20241128150632-1e6dfe1c6183 + github.com/grafana/ckit v0.0.0-20250226083311-4f9f4aacabb5 github.com/grafana/cloudflare-go v0.0.0-20230110200409-c627cf6792f2 github.com/grafana/dskit v0.0.0-20250131191929-eab36484cec2 github.com/grafana/go-gelf/v2 v2.0.1 @@ -75,7 +75,7 @@ require ( github.com/grafana/snowflake-prometheus-exporter v0.0.0-20240813124544-9995e8354548 github.com/grafana/tail v0.0.0-20230510142333-77b18831edf0 github.com/grafana/vmware_exporter v0.0.5-beta.0.20250218170317-73398ba08329 - github.com/grafana/walqueue v0.0.0-20250222022458-49d08775d0f4 + github.com/grafana/walqueue v0.0.0-20250226140916-7365e13bbede github.com/hashicorp/consul/api v1.31.0 github.com/hashicorp/go-discover v0.0.0-20230724184603-e89ebd1b2f65 github.com/hashicorp/go-multierror v1.1.1 @@ -260,14 +260,14 @@ require ( go.uber.org/goleak v1.3.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 - golang.org/x/crypto v0.32.0 + golang.org/x/crypto v0.33.0 golang.org/x/crypto/x509roots/fallback v0.0.0-20240208163226-62c9f1799c91 golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 - golang.org/x/net v0.34.0 + golang.org/x/net v0.35.0 golang.org/x/oauth2 v0.25.0 - golang.org/x/sync v0.10.0 - golang.org/x/sys v0.29.0 - golang.org/x/text v0.21.0 + golang.org/x/sync v0.11.0 + golang.org/x/sys v0.30.0 + golang.org/x/text v0.22.0 golang.org/x/time v0.9.0 golang.org/x/tools v0.29.0 google.golang.org/api v0.217.0 @@ -584,6 +584,7 @@ require ( github.com/hashicorp/go-envparse v0.1.0 // indirect github.com/hashicorp/go-hclog v1.6.3 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect + github.com/hashicorp/go-metrics v0.5.4 // indirect github.com/hashicorp/go-msgpack v1.1.5 // indirect github.com/hashicorp/go-msgpack/v2 v2.1.1 // indirect github.com/hashicorp/go-retryablehttp v0.7.7 // indirect @@ -596,7 +597,7 @@ require ( github.com/hashicorp/go-version v1.7.0 // indirect github.com/hashicorp/hcl v1.0.1-vault-5 // indirect github.com/hashicorp/mdns v1.0.4 // indirect - github.com/hashicorp/memberlist v0.5.1 // indirect + github.com/hashicorp/memberlist v0.5.3 // indirect github.com/hashicorp/nomad/api v0.0.0-20240717122358-3d93bd3778f3 // indirect github.com/hashicorp/serf v0.10.1 // indirect github.com/hashicorp/vic v1.5.1-0.20190403131502-bbfe86ec9443 // indirect @@ -870,7 +871,7 @@ require ( golang.design/x/chann v0.1.2 // indirect golang.org/x/arch v0.7.0 // indirect golang.org/x/mod v0.22.0 // indirect - golang.org/x/term v0.28.0 // indirect + golang.org/x/term v0.29.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect gonum.org/v1/gonum v0.15.1 // indirect diff --git a/go.sum b/go.sum index ba88b9ae20..7899e44ea4 100644 --- a/go.sum +++ b/go.sum @@ -1252,8 +1252,8 @@ github.com/grafana/cadvisor v0.0.0-20240729082359-1f04a91701e2 h1:ju6EcY2aEobeBg github.com/grafana/cadvisor v0.0.0-20240729082359-1f04a91701e2/go.mod h1:8sLW/G7rcFe1CKMaA4pYT4mX3P1xQVGqM6luzEzx/2g= github.com/grafana/catchpoint-prometheus-exporter v0.0.0-20250218151502-6e97feaee761 h1:dPJOIEwtQ8uR3Qa79pb/lsSFJQ6j4P9vpCUQ4fKimG4= github.com/grafana/catchpoint-prometheus-exporter v0.0.0-20250218151502-6e97feaee761/go.mod h1:S/M+H/0B7LSWtXbvzEOwqCl96xP6c1NOInW21+bzol0= -github.com/grafana/ckit v0.0.0-20241128150632-1e6dfe1c6183 h1:9ubc4+JkJ6lChOOxXsFalg0LMAqUX6eXZqu80luIvlA= -github.com/grafana/ckit v0.0.0-20241128150632-1e6dfe1c6183/go.mod h1:+Ddq4Cmuz2NnrPzhlZyEdxcDzsPhT6CW270t1aiCj5k= +github.com/grafana/ckit v0.0.0-20250226083311-4f9f4aacabb5 h1:EkW+rjr8zqiB4Jd7Gn5BmUhDz6PsZ0w33/4osKRd5x8= +github.com/grafana/ckit v0.0.0-20250226083311-4f9f4aacabb5/go.mod h1:izhHi8mZ16lxMxsdlFjPHzkopbjKNdorTtitYyzAejY= github.com/grafana/cloudflare-go v0.0.0-20230110200409-c627cf6792f2 h1:qhugDMdQ4Vp68H0tp/0iN17DM2ehRo1rLEdOFe/gB8I= github.com/grafana/cloudflare-go v0.0.0-20230110200409-c627cf6792f2/go.mod h1:w/aiO1POVIeXUQyl0VQSZjl5OAGDTL5aX+4v0RA1tcw= github.com/grafana/dskit v0.0.0-20250131191929-eab36484cec2 h1:9xJDVoTFhzJZzvghXGDDQJapDQfYvVM+/TcWySUZ1VE= @@ -1303,8 +1303,8 @@ github.com/grafana/tail v0.0.0-20230510142333-77b18831edf0 h1:bjh0PVYSVVFxzINqPF github.com/grafana/tail v0.0.0-20230510142333-77b18831edf0/go.mod h1:7t5XR+2IA8P2qggOAHTj/GCZfoLBle3OvNSYh1VkRBU= github.com/grafana/vmware_exporter v0.0.5-beta.0.20250218170317-73398ba08329 h1:Rs4H1yv2Abk3xE82qpyhMGGA8rswAOA0HQZde/BYkFo= github.com/grafana/vmware_exporter v0.0.5-beta.0.20250218170317-73398ba08329/go.mod h1:Z28219aViNlsLlPvuCnlgHDagRdZBAZ7JOnQg1b3eWg= -github.com/grafana/walqueue v0.0.0-20250222022458-49d08775d0f4 h1:oEDouKyuO62LKR46nb/4Z1nKx2tcxLK9eLMmHJtNdwQ= -github.com/grafana/walqueue v0.0.0-20250222022458-49d08775d0f4/go.mod h1:++oxbVcfnIzbSKHNxpO3WpQJG5ufmnwtBJqh5rvEmVo= +github.com/grafana/walqueue v0.0.0-20250226140916-7365e13bbede h1:9xJHxsGrN7RPwXNPDSwmE6ivdJMRVnTRQITopBtxKik= +github.com/grafana/walqueue v0.0.0-20250226140916-7365e13bbede/go.mod h1:++oxbVcfnIzbSKHNxpO3WpQJG5ufmnwtBJqh5rvEmVo= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grobie/gomemcache v0.0.0-20230213081705-239240bbc445 h1:FlKQKUYPZ5yDCN248M3R7x8yu2E3yEZ0H7aLomE4EoE= github.com/grobie/gomemcache v0.0.0-20230213081705-239240bbc445/go.mod h1:L69/dBlPQlWkcnU76WgcppK5e4rrxzQdi6LhLnK/ytA= @@ -1371,6 +1371,8 @@ github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJ github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-kms-wrapping/entropy v0.1.0/go.mod h1:d1g9WGtAunDNpek8jUIEJnBlbgKS1N2Q61QkHiZyR1g= github.com/hashicorp/go-memdb v0.0.0-20180223233045-1289e7fffe71/go.mod h1:kbfItVoBJwCfKXDXN4YoAXjxcFVZ7MRrJzyTX6H4giE= +github.com/hashicorp/go-metrics v0.5.4 h1:8mmPiIJkTPPEbAiV97IxdAGNdRdaWwVap1BU6elejKY= +github.com/hashicorp/go-metrics v0.5.4/go.mod h1:CG5yz4NZ/AI/aQt9Ucm/vdBnbh7fvmv4lxZ350i+QQI= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-msgpack v0.5.4/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= @@ -1446,8 +1448,8 @@ github.com/hashicorp/memberlist v0.1.4/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2p github.com/hashicorp/memberlist v0.1.5/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= -github.com/hashicorp/memberlist v0.5.1 h1:mk5dRuzeDNis2bi6LLoQIXfMH7JQvAzt3mQD0vNZZUo= -github.com/hashicorp/memberlist v0.5.1/go.mod h1:zGDXV6AqbDTKTM6yxW0I4+JtFzZAJVoIPvss4hV8F24= +github.com/hashicorp/memberlist v0.5.3 h1:tQ1jOCypD0WvMemw/ZhhtH+PWpzcftQvgCorLu0hndk= +github.com/hashicorp/memberlist v0.5.3/go.mod h1:h60o12SZn/ua/j0B6iKAZezA4eDaGsIuPO70eOaJ6WE= github.com/hashicorp/net-rpc-msgpackrpc v0.0.0-20151116020338-a14192a58a69/go.mod h1:/z+jUGRBlwVpUZfjute9jWaF6/HuhjuFQuL1YXzVD1Q= github.com/hashicorp/nomad/api v0.0.0-20240717122358-3d93bd3778f3 h1:fgVfQ4AC1avVOnu2cfms8VAiD8lUq3vWI8mTocOXN/w= github.com/hashicorp/nomad/api v0.0.0-20240717122358-3d93bd3778f3/go.mod h1:svtxn6QnrQ69P23VvIWMR34tg3vmwLz4UdUzm1dSCgE= @@ -2969,8 +2971,8 @@ golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= -golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= -golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= +golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= +golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= golang.org/x/crypto/x509roots/fallback v0.0.0-20240208163226-62c9f1799c91 h1:Lyizcy9jX02jYR0ceBkL6S+jRys8Uepf7wt1vrz6Ras= golang.org/x/crypto/x509roots/fallback v0.0.0-20240208163226-62c9f1799c91/go.mod h1:kNa9WdvYnzFwC79zRpLRMJbdEFlhyM5RPFBBZp/wWH8= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -3099,8 +3101,8 @@ golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= -golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= -golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= +golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= +golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= golang.org/x/oauth2 v0.0.0-20170807180024-9a379c6b3e95/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -3135,8 +3137,9 @@ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -3259,8 +3262,8 @@ golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= -golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -3276,8 +3279,8 @@ golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= -golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= -golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= +golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= +golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -3297,8 +3300,9 @@ golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/internal/component/discovery/discovery_test.go b/internal/component/discovery/discovery_test.go index 407ff5d7ef..619029f0b5 100644 --- a/internal/component/discovery/discovery_test.go +++ b/internal/component/discovery/discovery_test.go @@ -268,11 +268,11 @@ func updateDiscoverer(comp *Component, discoverer *fakeDiscoverer) { type fakeDiscoverer struct { publishChan chan<- []*targetgroup.Group - ready sync.WaitGroup + ready *sync.WaitGroup } func newFakeDiscoverer() *fakeDiscoverer { - ready := sync.WaitGroup{} + ready := &sync.WaitGroup{} ready.Add(1) return &fakeDiscoverer{ ready: ready, @@ -287,9 +287,7 @@ func (f *fakeDiscoverer) Publish(tg []*targetgroup.Group) { func (f *fakeDiscoverer) Run(ctx context.Context, publishChan chan<- []*targetgroup.Group) { f.publishChan = publishChan f.ready.Done() - select { - case <-ctx.Done(): - } + <-ctx.Done() } func (f *fakeDiscoverer) Register() error { return nil } diff --git a/internal/component/discovery/target.go b/internal/component/discovery/target.go index e72de2492c..c85660f899 100644 --- a/internal/component/discovery/target.go +++ b/internal/component/discovery/target.go @@ -188,7 +188,17 @@ func (t Target) ConvertInto(dst interface{}) error { }) *dst = result return nil + case *map[string]string: + result := make(map[string]string, t.Len()) + // NOTE: no need to sort as value_tokens.go in syntax/token/builder package sorts the map's keys. + t.ForEachLabel(func(key string, value string) bool { + result[key] = value + return true + }) + *dst = result + return nil } + return fmt.Errorf("target::ConvertInto: conversion to '%T' is not supported", dst) } @@ -211,8 +221,15 @@ func (t *Target) ConvertFrom(src interface{}) error { } *t = NewTargetFromLabelSet(labelSet) return nil + case map[string]string: + labelSet := make(commonlabels.LabelSet, len(src)) + for k, v := range src { + labelSet[commonlabels.LabelName(k)] = commonlabels.LabelValue(v) + } + *t = NewTargetFromLabelSet(labelSet) + return nil } - return fmt.Errorf("target: conversion from '%T' is not supported", src) + return fmt.Errorf("target::ConvertFrom: conversion from '%T' is not supported", src) } func (t Target) String() string { diff --git a/internal/component/discovery/target_builder.go b/internal/component/discovery/target_builder.go index 7ea393dbca..826887a46f 100644 --- a/internal/component/discovery/target_builder.go +++ b/internal/component/discovery/target_builder.go @@ -72,7 +72,7 @@ func (t targetBuilder) Get(label string) string { if ok { return string(lv) } - lv, ok = t.group[commonlabels.LabelName(label)] + lv = t.group[commonlabels.LabelName(label)] return string(lv) } @@ -114,10 +114,8 @@ func (t targetBuilder) Set(label string, val string) { func (t targetBuilder) Del(labels ...string) { for _, label := range labels { t.toDel[label] = struct{}{} - // If we were adding one, need to clean it up too. - if _, ok := t.toAdd[label]; ok { - delete(t.toAdd, label) - } + // If we were adding one, may need to clean it up too. + delete(t.toAdd, label) } } diff --git a/internal/component/discovery/target_test.go b/internal/component/discovery/target_test.go index e0dc111045..ef01534b91 100644 --- a/internal/component/discovery/target_test.go +++ b/internal/component/discovery/target_test.go @@ -117,21 +117,70 @@ func TestEncode_Decode_Targets(t *testing.T) { for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { - // Test encoding - f := builder.NewFile() - f.Body().SetAttributeValue("target", NewTargetFromMap(tc.input)) - encoded := string(f.Bytes()) - require.Equal(t, tc.expected, encoded) - - // Try decoding now - toDecode := strings.TrimPrefix(encoded, "target = ") - scope := vm.NewScope(map[string]interface{}{}) - expr, err := parser.ParseExpression(toDecode) - require.NoError(t, err) - eval := vm.New(expr) - actual := Target{} - require.NoError(t, eval.Evaluate(scope, &actual)) - require.Equal(t, NewTargetFromMap(tc.input), actual) + t.Run("encode into text", func(t *testing.T) { + f := builder.NewFile() + f.Body().SetAttributeValue("target", NewTargetFromMap(tc.input)) + encoded := string(f.Bytes()) + require.Equal(t, tc.expected, encoded) + }) + + var toDecode string + t.Run("encode target", func(t *testing.T) { + f := builder.NewFile() + f.Body().SetAttributeValue("target", NewTargetFromMap(tc.input)) + encoded := string(f.Bytes()) + require.Equal(t, tc.expected, encoded) + // store toDecode for other tests + toDecode = strings.TrimPrefix(encoded, "target = ") + }) + + t.Run("decode into target", func(t *testing.T) { + expr, err := parser.ParseExpression(toDecode) + require.NoError(t, err) + eval := vm.New(expr) + actual := Target{} + require.NoError(t, eval.Evaluate(vm.NewScope(map[string]interface{}{}), &actual)) + require.Equal(t, NewTargetFromMap(tc.input), actual) + }) + + t.Run("decode into a map", func(t *testing.T) { + expr, err := parser.ParseExpression(toDecode) + require.NoError(t, err) + eval := vm.New(expr) + actualMap := map[string]string{} + require.NoError(t, eval.Evaluate(vm.NewScope(map[string]interface{}{}), &actualMap)) + require.Equal(t, tc.input, actualMap) + }) + + t.Run("decode into a map pointer", func(t *testing.T) { + expr, err := parser.ParseExpression(toDecode) + require.NoError(t, err) + eval := vm.New(expr) + actualMap := map[string]string{} + require.NoError(t, eval.Evaluate(vm.NewScope(map[string]interface{}{}), &actualMap)) + require.Equal(t, &tc.input, &actualMap) + }) + + t.Run("decode from target into map via scope", func(t *testing.T) { + // If not supported, this would lead to error: target::ConvertInto: conversion to '*map[string]string' is not supported + scope := vm.NewScope(map[string]interface{}{"export": NewTargetFromMap(tc.input)}) + expr, err := parser.ParseExpression("export") + require.NoError(t, err) + eval := vm.New(expr) + actualMap := map[string]string{} + require.NoError(t, eval.Evaluate(scope, &actualMap)) + require.Equal(t, tc.input, actualMap) + }) + + t.Run("decode from map into target via scope", func(t *testing.T) { + scope := vm.NewScope(map[string]interface{}{"map": tc.input}) + expr, err := parser.ParseExpression("map") + require.NoError(t, err) + eval := vm.New(expr) + actual := Target{} + require.NoError(t, eval.Evaluate(scope, &actual)) + require.Equal(t, NewTargetFromMap(tc.input), actual) + }) }) } } @@ -281,7 +330,7 @@ func TestTargetMisc(t *testing.T) { require.Equal(t, []string{"a=5", "b=10"}, seen) // Some loggers print targets out, check it's all good. - require.Equal(t, `{"a"="5", "b"="10"}`, fmt.Sprintf("%s", target)) + require.Equal(t, `{"a"="5", "b"="10"}`, target.String()) } func TestConvertFromNative(t *testing.T) { diff --git a/internal/component/prometheus/write/queue/component.go b/internal/component/prometheus/write/queue/component.go index 89ee1e0251..acf68a1889 100644 --- a/internal/component/prometheus/write/queue/component.go +++ b/internal/component/prometheus/write/queue/component.go @@ -67,7 +67,11 @@ func (s *Queue) Run(ctx context.Context) error { } }() for _, ep := range s.endpoints { - ep.Start(ctx) + // If any of these fail to start thats a problem. + err := ep.Start(ctx) + if err != nil { + return err + } } <-ctx.Done() @@ -113,7 +117,10 @@ func (s *Queue) Update(args component.Arguments) error { if err != nil { return err } - end.Start(s.ctx) + err = end.Start(s.ctx) + if err != nil { + return err + } s.endpoints[epCfg.Name] = end }