diff --git a/go.mod b/go.mod index 1c186c1ff9..da7088f896 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/grafana/alloy -go 1.24.6 +go 1.25 require ( cloud.google.com/go/pubsub v1.50.0 @@ -460,12 +460,13 @@ require ( github.com/Workiva/go-datastructures v1.1.5 // indirect github.com/alecthomas/participle/v2 v2.1.4 // indirect github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect - github.com/andybalholm/brotli v1.1.1 // indirect + github.com/andybalholm/brotli v1.2.0 // indirect github.com/antchfx/xmlquery v1.4.4 // indirect github.com/antchfx/xpath v1.3.5 // indirect - github.com/apache/arrow-go/v18 v18.3.1 // indirect + github.com/apache/arrow-go/v18 v18.4.0 // indirect github.com/apache/thrift v0.22.0 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect + github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de // indirect github.com/armon/go-metrics v0.4.1 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/aws/aws-msk-iam-sasl-signer-go v1.0.4 // indirect @@ -501,6 +502,7 @@ require ( github.com/aws/smithy-go v1.23.0 // indirect github.com/axiomhq/hyperloglog v0.2.5 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect + github.com/basgys/goxml2json v1.1.0 // indirect github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 // indirect github.com/beevik/ntp v1.3.0 // indirect github.com/benbjohnson/clock v1.3.5 // indirect @@ -517,12 +519,14 @@ require ( github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect github.com/channelmeter/iso8601duration v0.0.0-20150204201828-8da3af7a2a61 github.com/checkpoint-restore/go-criu/v6 v6.3.0 // indirect + github.com/cheekybits/genny v1.0.0 // indirect + github.com/chromedp/cdproto v0.0.0-20250803210736-d308e07a266d // indirect github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect github.com/cilium/ebpf v0.19.0 // indirect github.com/cloudflare/circl v1.6.1 // indirect github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 // indirect github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 // indirect - github.com/containerd/console v1.0.4 // indirect + github.com/containerd/console v1.0.5 // indirect github.com/containerd/continuity v0.4.5 // indirect github.com/containerd/errdefs v1.0.0 // indirect github.com/containerd/errdefs/pkg v0.3.0 // indirect @@ -532,6 +536,7 @@ require ( github.com/containers/common v0.64.1 // indirect github.com/coreos/go-semver v0.3.1 // indirect github.com/cpuguy83/dockercfg v0.3.2 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect github.com/creack/pty v1.1.24 // indirect github.com/cyphar/filepath-securejoin v0.4.1 // indirect github.com/danieljoos/wincred v1.2.2 // indirect @@ -562,6 +567,7 @@ require ( github.com/elastic/go-sysinfo v1.8.1 // indirect github.com/elastic/go-windows v1.0.1 // indirect github.com/elastic/lunes v0.1.0 // indirect + github.com/elazarl/goproxy v1.7.2 // indirect github.com/ema/qdisc v1.0.0 // indirect github.com/emicklei/go-restful/v3 v3.12.2 // indirect github.com/emirpasic/gods v1.18.1 // indirect @@ -578,6 +584,7 @@ require ( github.com/fxamacker/cbor/v2 v2.8.0 // indirect github.com/gabriel-vasile/mimetype v1.4.8 // indirect github.com/gavv/monotime v0.0.0-20190418164738-30dba4353424 // indirect + github.com/getkin/kin-openapi v0.132.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.6.2 // indirect github.com/go-jose/go-jose/v4 v4.1.1 // indirect @@ -626,13 +633,28 @@ require ( github.com/gophercloud/gophercloud/v2 v2.7.0 // indirect github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect github.com/gosnmp/gosnmp v1.41.0 // indirect + github.com/grafana/dataplane/sdata v0.0.9 // indirect github.com/grafana/faro/pkg/go v0.0.0-20250314155512-06a06da3b8bc // indirect github.com/grafana/go-offsets-tracker v0.1.7 // indirect github.com/grafana/gomemcache v0.0.0-20250318131618-74242eea118d // indirect + github.com/grafana/grafana-aws-sdk v1.0.4 // indirect + github.com/grafana/grafana-infinity-datasource v1.4.2-0.20250923103914-f441d7893a0b + github.com/grafana/grafana-plugin-sdk-go v0.279.0 // indirect + github.com/grafana/infinity-libs/lib/go/csvframer v1.0.3 // indirect + github.com/grafana/infinity-libs/lib/go/framesql v1.0.3 // indirect + github.com/grafana/infinity-libs/lib/go/gframer v1.1.2 // indirect + github.com/grafana/infinity-libs/lib/go/jsonframer v1.3.0 // indirect + github.com/grafana/infinity-libs/lib/go/macros v1.0.3 // indirect + github.com/grafana/infinity-libs/lib/go/transformations v1.0.6 // indirect + github.com/grafana/infinity-libs/lib/go/utils v1.0.1 // indirect + github.com/grafana/infinity-libs/lib/go/xmlframer v1.0.3 // indirect github.com/grafana/jfr-parser v0.9.3 // indirect github.com/grafana/jvmtools v0.0.3 // indirect github.com/grafana/otel-profiling-go v0.5.1 // indirect + github.com/grafana/pyroscope/lidia v0.0.0-20250716102313-506840f4afcd + github.com/grafana/sqlds/v4 v4.2.3 // indirect github.com/grobie/gomemcache v0.0.0-20230213081705-239240bbc445 // indirect + github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.1.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect @@ -645,6 +667,7 @@ require ( 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-plugin v1.7.0 // indirect github.com/hashicorp/go-retryablehttp v0.7.7 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect github.com/hashicorp/go-secure-stdlib/awsutil v0.3.0 // indirect @@ -659,12 +682,14 @@ require ( github.com/hashicorp/nomad/api v0.0.0-20241218080744-e3ac00f30eec // indirect github.com/hashicorp/serf v0.10.2 // indirect github.com/hashicorp/vic v1.5.1-0.20190403131502-bbfe86ec9443 // indirect + github.com/hashicorp/yamux v0.1.2 // indirect github.com/hectane/go-acl v0.0.0-20230122075934-ca0b05cb1adb // indirect github.com/hetznercloud/hcloud-go/v2 v2.21.1 // indirect github.com/hodgesds/perf-utils v0.7.0 // indirect github.com/huandu/xstrings v1.5.0 // indirect github.com/iancoleman/strcase v0.3.0 // indirect github.com/ianlancetaylor/demangle v0.0.0-20250628045327-2d64ad6b7ec5 + github.com/icholy/digest v0.1.22 // indirect github.com/illumos/go-kstat v0.0.0-20210513183136-173c9b0a9973 // indirect github.com/imdario/mergo v0.3.16 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect @@ -676,6 +701,7 @@ require ( github.com/influxdata/tdigest v0.0.2-0.20210216194612-fc98d27c9e8b // indirect github.com/influxdata/telegraf v1.35.2 // indirect github.com/ionos-cloud/sdk-go/v6 v6.3.4 // indirect + github.com/itchyny/gojq v0.12.17 // indirect github.com/itchyny/timefmt-go v0.1.6 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect github.com/jackc/pgconn v1.14.3 // indirect @@ -699,6 +725,7 @@ require ( github.com/joyent/triton-go v1.8.5 // indirect github.com/jpillora/backoff v1.0.0 // indirect github.com/jsimonetti/rtnetlink v1.4.2 // indirect + github.com/jszwedko/go-datemath v0.1.1-0.20230526204004-640a500621d6 // indirect github.com/julienschmidt/httprouter v1.3.0 // indirect github.com/kamstrup/intmap v0.5.1 // indirect github.com/karrick/godirwalk v1.17.0 // indirect @@ -719,6 +746,7 @@ require ( github.com/magefile/mage v1.15.0 // indirect github.com/magiconair/properties v1.8.10 // indirect github.com/mailru/easyjson v0.9.0 // indirect + github.com/mattetti/filebuffer v1.0.1 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect @@ -739,6 +767,11 @@ require ( github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/mithrandie/csvq v1.18.1 // indirect + github.com/mithrandie/csvq-driver v1.7.0 // indirect + github.com/mithrandie/go-file/v2 v2.1.0 // indirect + github.com/mithrandie/go-text v1.6.0 // indirect + github.com/mithrandie/ternary v1.1.1 // indirect github.com/mna/redisc v1.4.0 // indirect github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/go-archive v0.1.0 // indirect @@ -759,8 +792,11 @@ require ( github.com/mtibben/percent v0.2.1 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/ncabatoff/go-seq v0.0.0-20180805175032-b08ef85ed833 // indirect + github.com/ncruces/go-strftime v0.1.9 // indirect github.com/nicolai86/scaleway-sdk v1.10.2-0.20180628010248-798f60e20bb2 // indirect github.com/oapi-codegen/runtime v1.1.1 // indirect + github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 // indirect + github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 // indirect github.com/ohler55/ojg v1.26.8 // indirect github.com/oklog/ulid v1.3.1 // indirect github.com/oklog/ulid/v2 v2.1.1 // indirect @@ -808,6 +844,8 @@ require ( github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/percona/percona-backup-mongodb v1.8.1-0.20250218045950-7e9f38fe06ab // indirect + github.com/perimeterx/marshmallow v1.1.5 // indirect + github.com/peterbourgon/ff/v3 v3.4.0 // indirect; indirect\ github.com/philhofer/fwd v1.2.0 // indirect github.com/pierrec/lz4 v2.6.1+incompatible // indirect github.com/pierrec/lz4/v4 v4.1.22 // indirect @@ -831,6 +869,7 @@ require ( github.com/remeh/sizedwaitgroup v1.0.0 // indirect github.com/renier/xmlrpc v0.0.0-20170708154548-ce4a1a486c03 // indirect github.com/rivo/uniseg v0.4.7 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/ryanuber/go-glob v1.0.0 // indirect github.com/safchain/ethtool v0.5.10 // indirect github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da // indirect @@ -876,6 +915,10 @@ require ( github.com/twmb/murmur3 v1.1.8 // indirect github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 // indirect github.com/uber/jaeger-lib v2.4.1+incompatible // indirect + github.com/unknwon/bra v0.0.0-20200517080246-1e3013ecaff8 // indirect + github.com/unknwon/com v1.0.1 // indirect + github.com/unknwon/log v0.0.0-20200308114134-929b1006e34a // indirect + github.com/urfave/cli v1.22.17 // indirect github.com/valyala/fastjson v1.6.4 // indirect github.com/vertica/vertica-sql-go v1.3.3 // indirect github.com/vishvananda/netlink v1.3.1 // indirect @@ -893,6 +936,7 @@ require ( github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/xhit/go-str2duration/v2 v2.1.0 // indirect + github.com/xiatechs/jsonata-go v1.8.8 // indirect github.com/xo/dburl v0.20.0 // indirect github.com/yl2chen/cidranger v1.0.2 // indirect github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect @@ -941,12 +985,12 @@ require ( go.opentelemetry.io/contrib/detectors/gcp v1.36.0 // indirect go.opentelemetry.io/contrib/exporters/autoexport v0.61.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.61.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.62.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 go.opentelemetry.io/contrib/otelconf v0.16.0 // indirect go.opentelemetry.io/contrib/propagators/b3 v1.37.0 // indirect - go.opentelemetry.io/contrib/propagators/jaeger v1.35.0 - go.opentelemetry.io/contrib/samplers/jaegerremote v0.30.0 // indirect + go.opentelemetry.io/contrib/propagators/jaeger v1.37.0 + go.opentelemetry.io/contrib/samplers/jaegerremote v0.31.0 // indirect go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.13.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.13.0 // indirect @@ -972,6 +1016,7 @@ require ( google.golang.org/genproto v0.0.0-20250603155806-513f23925822 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250728155136-f173205681a0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250818200422-3122310a409c // indirect + gopkg.in/Knetic/govaluate.v3 v3.0.0 // indirect gopkg.in/alecthomas/kingpin.v2 v2.2.6 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/fsnotify/fsnotify.v1 v1.4.7 // indirect @@ -984,16 +1029,12 @@ require ( howett.net/plist v1.0.0 // indirect k8s.io/apiextensions-apiserver v0.33.0 // indirect k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff // indirect + moul.io/http2curl v1.0.0 // indirect sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect sigs.k8s.io/randfill v1.0.0 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.7.0 // indirect ) -require ( - github.com/grafana/pyroscope/lidia v0.0.0-20250716102313-506840f4afcd - github.com/peterbourgon/ff/v3 v3.4.0 // indirect -) - // NOTE: replace directives below must always be *temporary*. // // Adding a replace directive to change a module to a fork of a module will diff --git a/go.sum b/go.sum index 9706685c27..37d39dabf8 100644 --- a/go.sum +++ b/go.sum @@ -449,8 +449,8 @@ github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b/go.mod h1:fvzegU4 github.com/alicebob/miniredis v2.5.0+incompatible h1:yBHoLpsyjupjz3NL3MhKMVkR41j82Yjf3KFv7ApYzUI= github.com/alicebob/miniredis/v2 v2.35.0 h1:QwLphYqCEAo1eu1TqPRN2jgVMPBweeQcR21jeqDCONI= github.com/alicebob/miniredis/v2 v2.35.0/go.mod h1:TcL7YfarKPGDAthEtl5NBeHZfeUQj6OXMm/+iu5cLMM= -github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= -github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= +github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= +github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/antchfx/xmlquery v1.4.4 h1:mxMEkdYP3pjKSftxss4nUHfjBhnMk4imGoR96FRY2dg= @@ -460,12 +460,14 @@ github.com/antchfx/xpath v1.3.5 h1:PqbXLC3TkfeZyakF5eeh3NTWEbYl4VHNVeufANzDbKQ= github.com/antchfx/xpath v1.3.5/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/arrow-go/v18 v18.3.1 h1:oYZT8FqONiK74JhlH3WKVv+2NKYoyZ7C2ioD4Dj3ixk= -github.com/apache/arrow-go/v18 v18.3.1/go.mod h1:12QBya5JZT6PnBihi5NJTzbACrDGXYkrgjujz3MRQXU= +github.com/apache/arrow-go/v18 v18.4.0 h1:/RvkGqH517iY8bZKc4FD5/kkdwXJGjxf28JIXbJ/oB0= +github.com/apache/arrow-go/v18 v18.4.0/go.mod h1:Aawvwhj8x2jURIzD9Moy72cF0FyJXOpkYpdmGRHcw14= github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc= github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g= github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= +github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de h1:FxWPpzIjnTlhPwqqXc4/vE0f7GvRjuAsbW+HOIe8KnA= +github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de/go.mod h1:DCaWoUhZrYW9p1lxo/cm8EmUOOzAPSEZNGF2DK1dJgw= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= @@ -582,6 +584,8 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bitly/go-simplejson v0.5.1 h1:xgwPbetQScXt1gh9BmoJ6j9JMr3TElvuIyjR8pgdoow= +github.com/bitly/go-simplejson v0.5.1/go.mod h1:YOPVLzCfwK14b4Sff3oP1AmGhI9T9Vsg84etUnlyp+Q= github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bits-and-blooms/bloom/v3 v3.7.0 h1:VfknkqV4xI+PsaDIsoHueyxVDZrfvMn56jeWUzvzdls= @@ -603,6 +607,8 @@ github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= +github.com/bufbuild/protocompile v0.14.1 h1:iA73zAf/fyljNjQKwYzUHD6AD4R8KMasmwa/FBatYVw= +github.com/bufbuild/protocompile v0.14.1/go.mod h1:ppVdAIhbr2H8asPk6k4pY7t9zB1OU5DoEw9xY/FUi1c= github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/burningalchemist/sql_exporter v0.0.0-20240103092044-466b38b6abc4 h1:dgjwrjeVe90AeMhrx04TmDKjZe7xqKKEUxT3QKNx9RU= @@ -631,7 +637,11 @@ github.com/channelmeter/iso8601duration v0.0.0-20150204201828-8da3af7a2a61 h1:o6 github.com/channelmeter/iso8601duration v0.0.0-20150204201828-8da3af7a2a61/go.mod h1:Rp8e0DCtEKwXFOC6JPJQVTz8tuGoGvw6Xfexggh/ed0= github.com/checkpoint-restore/go-criu/v6 v6.3.0 h1:mIdrSO2cPNWQY1truPg6uHLXyKHk3Z5Odx4wjKOASzA= github.com/checkpoint-restore/go-criu/v6 v6.3.0/go.mod h1:rrRTN/uSwY2X+BPRl/gkulo9gsKOSAeVp9/K2tv7xZI= +github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= +github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= +github.com/chromedp/cdproto v0.0.0-20250803210736-d308e07a266d h1:ZtA1sedVbEW7EW80Iz2GR3Ye6PwbJAJXjv7D74xG6HU= +github.com/chromedp/cdproto v0.0.0-20250803210736-d308e07a266d/go.mod h1:NItd7aLkcfOA/dcMXvl8p1u+lQqioRMq/SqDp71Pb/k= github.com/chromedp/chromedp v0.9.2/go.mod h1:LkSXJKONWTCHAfQasKFUZI+mxqS4tZqhmtGzzhLsnLs= github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -659,8 +669,8 @@ github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 h1:aQ3y1lwWyqYPiWZThqv github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/containerd/console v1.0.4 h1:F2g4+oChYvBTsASRTz8NP6iIAi97J3TtSAsLbIFn4ro= -github.com/containerd/console v1.0.4/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= +github.com/containerd/console v1.0.5 h1:R0ymNeydRqH2DmakFNdmjR2k0t7UPuiOV/N/27/qqsc= +github.com/containerd/console v1.0.5/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= github.com/containerd/continuity v0.4.5 h1:ZRoN1sXq9u7V6QoHMcVWGhOwDFqZ4B9i5H6un1Wh0x4= github.com/containerd/continuity v0.4.5/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE= github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= @@ -697,8 +707,11 @@ github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfc github.com/cpuguy83/dockercfg v0.3.2 h1:DlJTyZGBDlXqUZ2Dk2Q3xHs/FtnooJJVaad2S9GKorA= github.com/cpuguy83/dockercfg v0.3.2/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo= +github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s= @@ -857,6 +870,8 @@ github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3G github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8= github.com/gavv/monotime v0.0.0-20190418164738-30dba4353424 h1:Vh7rylVZRZCj6W41lRlP17xPk4Nq260H4Xo/DDYmEZk= github.com/gavv/monotime v0.0.0-20190418164738-30dba4353424/go.mod h1:vmp8DIyckQMXOPl0AQVHt+7n5h7Gb7hS6CUydiV8QeA= +github.com/getkin/kin-openapi v0.132.0 h1:3ISeLMsQzcb5v26yeJrBcdTCEQTag36ZjaGk7MIRUwk= +github.com/getkin/kin-openapi v0.132.0/go.mod h1:3OlG51PCYNsPByuiMB0t4fjnNlIDnaEDsjiKUV8nL58= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/githubexporter/github-exporter v0.0.0-20231025122338-656e7dc33fe7 h1:wT/4jrX36BHZMjkpPYrCY4lJR+HHG7L+cC0M3p5letQ= github.com/githubexporter/github-exporter v0.0.0-20231025122338-656e7dc33fe7/go.mod h1:q49R4E4fu+HqGnSSSFpAuJIMm8DV5YNhKBW/Ke9SBPE= @@ -1111,6 +1126,7 @@ github.com/gophercloud/gophercloud v1.14.1/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfg github.com/gophercloud/gophercloud/v2 v2.7.0 h1:o0m4kgVcPgHlcXiWAjoVxGd8QCmvM5VU+YM71pFbn0E= github.com/gophercloud/gophercloud/v2 v2.7.0/go.mod h1:Ki/ILhYZr/5EPebrPL9Ej+tUg4lqx71/YH2JWVeU+Qk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= @@ -1134,6 +1150,8 @@ github.com/grafana/ckit v0.0.0-20250514165824-dd4adf36ad34 h1:t1Nfp9udkvbYiCwNEz github.com/grafana/ckit v0.0.0-20250514165824-dd4adf36ad34/go.mod h1:THPMJBdU2XgYUsYCG/PvtaYj1/NH4uNjw7U5kNohrLY= 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/dataplane/sdata v0.0.9 h1:AGL1LZnCUG4MnQtnWpBPbQ8ZpptaZs14w6kE/MWfg7s= +github.com/grafana/dataplane/sdata v0.0.9/go.mod h1:Jvs5ddpGmn6vcxT7tCTWAZ1mgi4sbcdFt9utQx5uMAU= github.com/grafana/dskit v0.0.0-20250703125411-00229f5b510c h1:m5O2Oj755FlFhKSuQB1KwcFZZRVijZWYU7u34dhS88M= github.com/grafana/dskit v0.0.0-20250703125411-00229f5b510c/go.mod h1:gVg14WngG7SMnJ/5mZGNFAs31+7BhspoWfmZ/U4rb90= github.com/grafana/faro/pkg/go v0.0.0-20250314155512-06a06da3b8bc h1:o8BraeLtggPjb/n91jvQT4SgGn8j0jxOyIGEQSoIXwU= @@ -1144,6 +1162,28 @@ github.com/grafana/go-offsets-tracker v0.1.7 h1:2zBQ7iiGzvyXY7LA8kaaSiEqH/Yx82Uc github.com/grafana/go-offsets-tracker v0.1.7/go.mod h1:qcQdu7zlUKIFNUdBJlLyNHuJGW0SKWKjkrN6jtt+jds= github.com/grafana/gomemcache v0.0.0-20250318131618-74242eea118d h1:oXRJlb9UjVsl6LhqBdbyAQ9YFhExwsj4bjh5vwMNRZY= github.com/grafana/gomemcache v0.0.0-20250318131618-74242eea118d/go.mod h1:j/s0jkda4UXTemDs7Pgw/vMT06alWc42CHisvYac0qw= +github.com/grafana/grafana-aws-sdk v1.0.4 h1:D14UAehsOqpjliHmHzveRQ1p43KCsMzdmb7GovWj+SY= +github.com/grafana/grafana-aws-sdk v1.0.4/go.mod h1:hO7q7yWV+t6dmiyJjMa3IbuYnYkBua+G/IAlOPVIYKE= +github.com/grafana/grafana-infinity-datasource v1.4.2-0.20250923103914-f441d7893a0b h1:QRIKVywdnV5zE28SLhYayDR9wNbNGHOOg85PZlCB5fU= +github.com/grafana/grafana-infinity-datasource v1.4.2-0.20250923103914-f441d7893a0b/go.mod h1:pCdosYnP+BvETHK8QsyCSu5egd2m7LI4GX2Aq4PTzQc= +github.com/grafana/grafana-plugin-sdk-go v0.279.0 h1:/KCrsZkj9pEGwIGovqAz1A8rjI2A2YT+ZpvgfZN0LAA= +github.com/grafana/grafana-plugin-sdk-go v0.279.0/go.mod h1:/7oGN6Z7DGTGaLHhgIYrRr6Wvmdsb3BLw5hL4Kbjy88= +github.com/grafana/infinity-libs/lib/go/csvframer v1.0.3 h1:Vr1Iy2+VDe5Vkx3kLaNbUGVYvpdWqBiYg/BjSkCzPYg= +github.com/grafana/infinity-libs/lib/go/csvframer v1.0.3/go.mod h1:ykYYWHFpPRf0HRkTb7quqDdmwBrKFV8JSd6Xs6T1d4U= +github.com/grafana/infinity-libs/lib/go/framesql v1.0.3 h1:a1/lsOfqBlsHFaS+z5WQ7neWpExS4fUXXTzdfpCjvyk= +github.com/grafana/infinity-libs/lib/go/framesql v1.0.3/go.mod h1:4RrTcrB866Haf9JMznSI7hjvDP4pH4QJnbvLfPHXNNo= +github.com/grafana/infinity-libs/lib/go/gframer v1.1.2 h1:OsL0nGPEA3Q4hTLIvhHLE30PiLq6esa8i+MFjOCOwMc= +github.com/grafana/infinity-libs/lib/go/gframer v1.1.2/go.mod h1:qJi+zixSJkLFbyBgooj/kcHQ8idvWVx/OuOmFQbXhIg= +github.com/grafana/infinity-libs/lib/go/jsonframer v1.3.0 h1:lCotxcelY5n4B5XL3nLiTCYarJEplN7/nklCtiCB0yI= +github.com/grafana/infinity-libs/lib/go/jsonframer v1.3.0/go.mod h1:dXmNCtumlfpi1JFEee3N/gNp9R89+IzjtLW2xHAX7VI= +github.com/grafana/infinity-libs/lib/go/macros v1.0.3 h1:oslqHWpot6jeERproqCal3e1Yc5pCjeFJQ40nuWtj4c= +github.com/grafana/infinity-libs/lib/go/macros v1.0.3/go.mod h1:JaiReiEOOqu6r/36EV9Ro7ZSetB8PPGm/dLxAJjF2A4= +github.com/grafana/infinity-libs/lib/go/transformations v1.0.6 h1:xtgrtlhY2dAvelfe0454Gke8qDxhsVNsyHVxvcleRVs= +github.com/grafana/infinity-libs/lib/go/transformations v1.0.6/go.mod h1:sr0n5K0oFYtlvOCxoNWK8TL5rQHqSquYGMzKV1BkVq0= +github.com/grafana/infinity-libs/lib/go/utils v1.0.1 h1:eA/kfSTtnzutzajmijIG9LUunPpAR9epvdAB+khDCmk= +github.com/grafana/infinity-libs/lib/go/utils v1.0.1/go.mod h1:+hkrwV9ib8dsTCQDNh29PPE8Cnr9sy+w2XzuhrYqPTU= +github.com/grafana/infinity-libs/lib/go/xmlframer v1.0.3 h1:uKb2sHekW+eCJ34/SlGsoI2JUu6/4/F/mI0uBYeCF48= +github.com/grafana/infinity-libs/lib/go/xmlframer v1.0.3/go.mod h1:Y0O6Cbztd8e9oVx+M9kd1E5XorjNeDtOorrX2vxSkuk= github.com/grafana/jfr-parser v0.9.3 h1:rMrDfV7U5Ycz12/d57sQrN7UHmt1N6Wi6SSuNKi8hyk= github.com/grafana/jfr-parser v0.9.3/go.mod h1:KYbwbvXtBoOsYw9b9w8R01dbM5oVfopljq3hA1WDJMQ= github.com/grafana/jfr-parser/pprof v0.0.4 h1:QIpA0tTgG17m/l2B6X0tqf8dZu+AN/UY6B3aYLfAFtY= @@ -1190,6 +1230,8 @@ github.com/grafana/smimesign v0.2.1-0.20220408144937-2a5adf3481d3 h1:UPkAxuhlAcR github.com/grafana/smimesign v0.2.1-0.20220408144937-2a5adf3481d3/go.mod h1:iZiiwNT4HbtGRVqCQu7uJPEZCuEE5sfSSttcnePkDl4= github.com/grafana/snowflake-prometheus-exporter v0.0.0-20250627131542-0c2feac3a700 h1:2WcTPnt3H8OEPJvA5fDQk7dgIPWSAGr8xBBlm0zXm4w= github.com/grafana/snowflake-prometheus-exporter v0.0.0-20250627131542-0c2feac3a700/go.mod h1:TLf/gsyKggD6qiTXOC9dlTDFR0c3v6r/0Ufs6s9+xBc= +github.com/grafana/sqlds/v4 v4.2.3 h1:9ibD1c5O5u9fifEkBSig+jAc41TUEz+M+bWQqDsofP4= +github.com/grafana/sqlds/v4 v4.2.3/go.mod h1:bv+XHabfUF4xkgg4y+nYFCK8rpMHZsMaQk56qNaJcAM= github.com/grafana/tail v0.0.0-20230510142333-77b18831edf0 h1:bjh0PVYSVVFxzINqPFYJmAmJNrWPgnVjuSdYJGHmtFU= 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= @@ -1200,6 +1242,8 @@ github.com/grobie/gomemcache v0.0.0-20230213081705-239240bbc445 h1:FlKQKUYPZ5yDC github.com/grobie/gomemcache v0.0.0-20230213081705-239240bbc445/go.mod h1:L69/dBlPQlWkcnU76WgcppK5e4rrxzQdi6LhLnK/ytA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s= +github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.1.0 h1:QGLs/O40yoNK9vmy4rhUGBVyMf1lISBGtXRpsu/Qu/o= +github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.1.0/go.mod h1:hM2alZsMUni80N33RBe6J0e423LB+odMj7d3EMP9l20= github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 h1:sGm2vDRFUrQJO/Veii4h4zG2vvqG6uWNkBHSTqXOZk0= github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2/go.mod h1:wd1YpapPLivG6nQgbf7ZkG1hhSOXDhhn4MLTknx2aAc= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= @@ -1258,6 +1302,8 @@ github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+l github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY= github.com/hashicorp/go-plugin v1.4.3/go.mod h1:5fGEH17QVwTTcR0zV7yhDPLLmFX9YSZ38b18Udy6vYQ= +github.com/hashicorp/go-plugin v1.7.0 h1:YghfQH/0QmPNc/AZMTFE3ac8fipZyZECHdDPshfk+mA= +github.com/hashicorp/go-plugin v1.7.0/go.mod h1:BExt6KEaIYx804z8k4gRzRLEvxKVb+kn0NMcihqOqb8= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-retryablehttp v0.5.4/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-retryablehttp v0.6.6/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= @@ -1336,6 +1382,8 @@ github.com/hashicorp/vic v1.5.1-0.20190403131502-bbfe86ec9443 h1:O/pT5C1Q3mVXMyu github.com/hashicorp/vic v1.5.1-0.20190403131502-bbfe86ec9443/go.mod h1:bEpDU35nTu0ey1EXjwNwPjI9xErAsoOCmcMb9GKvyxo= github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= +github.com/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8= +github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns= github.com/hectane/go-acl v0.0.0-20230122075934-ca0b05cb1adb h1:PGufWXXDq9yaev6xX1YQauaO1MV90e6Mpoq1I7Lz/VM= github.com/hectane/go-acl v0.0.0-20230122075934-ca0b05cb1adb/go.mod h1:QiyDdbZLaJ/mZP4Zwc9g2QsfaEA4o7XvvgZegSci5/E= github.com/heroku/x v0.4.3 h1:HF1P4Mu79BKDVk4pt+oRDpcOSTRTpHq28RYAOkuJmds= @@ -1355,6 +1403,8 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1: github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= github.com/ianlancetaylor/demangle v0.0.0-20250628045327-2d64ad6b7ec5 h1:QCtizt3VTaANvnsd8TtD/eonx7JLIVdEKW1//ZNPZ9A= github.com/ianlancetaylor/demangle v0.0.0-20250628045327-2d64ad6b7ec5/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= +github.com/icholy/digest v0.1.22 h1:dRIwCjtAcXch57ei+F0HSb5hmprL873+q7PoVojdMzM= +github.com/icholy/digest v0.1.22/go.mod h1:uLAeDdWKIWNFMH0wqbwchbTQOmJWhzSnL7zmqSPqEEc= github.com/illumos/go-kstat v0.0.0-20210513183136-173c9b0a9973 h1:hk4LPqXIY/c9XzRbe7dA6qQxaT6Axcbny0L/G5a4owQ= github.com/illumos/go-kstat v0.0.0-20210513183136-173c9b0a9973/go.mod h1:PoK3ejP3LJkGTzKqRlpvCIFas3ncU02v8zzWDW+g0FY= github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= @@ -1388,6 +1438,8 @@ github.com/influxdata/telegraf v1.35.2 h1:MWeNIBGNSTDbXix87WGXWJAeMgSW9BoLxWQ4zm github.com/influxdata/telegraf v1.35.2/go.mod h1:0jgmYMXNgG/BdpEo9FFbaR+F57mNu5k7W9QPZQY2YB8= github.com/ionos-cloud/sdk-go/v6 v6.3.4 h1:jTvGl4LOF8v8OYoEIBNVwbFoqSGAFqn6vGE7sp7/BqQ= github.com/ionos-cloud/sdk-go/v6 v6.3.4/go.mod h1:wCVwNJ/21W29FWFUv+fNawOTMlFoP1dS3L+ZuztFW48= +github.com/itchyny/gojq v0.12.17 h1:8av8eGduDb5+rvEdaOO+zQUjA04MS0m3Ps8HiD+fceg= +github.com/itchyny/gojq v0.12.17/go.mod h1:WBrEMkgAfAGO1LUcGOckBl5O726KPp+OlkKug0I/FEY= github.com/itchyny/timefmt-go v0.1.6 h1:ia3s54iciXDdzWzwaVKXZPbiXzxxnv1SPGFfM/myJ5Q= github.com/itchyny/timefmt-go v0.1.6/go.mod h1:RRDZYC5s9ErkjQvTvvU7keJjxUYzIISJGxm9/mAERQg= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= @@ -1467,6 +1519,8 @@ github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJS github.com/jessevdk/go-flags v1.6.1 h1:Cvu5U8UGrLay1rZfv/zP7iLpSHGUZ/Ou68T0iX1bBK4= github.com/jessevdk/go-flags v1.6.1/go.mod h1:Mk8T1hIAWpOiJiHa9rJASDK2UGWji0EuPGBnNLMooyc= github.com/jhump/protoreflect v1.6.0/go.mod h1:eaTn3RZAmMBcV0fifFvlm6VHNz3wSkYyXYWUh7ymB74= +github.com/jhump/protoreflect v1.17.0 h1:qOEr613fac2lOuTgWN4tPAtLL7fUSbuJL5X5XumQh94= +github.com/jhump/protoreflect v1.17.0/go.mod h1:h9+vUUL38jiBzck8ck+6G/aeMX8Z4QUY/NiJPwPNi+8= github.com/jmespath-community/go-jmespath v1.1.1 h1:bFikPhsi/FdmlZhVgSCd2jj1e7G/rw+zyQfyg5UF+L4= github.com/jmespath-community/go-jmespath v1.1.1/go.mod h1:4gOyFJsR/Gk+05RgTKYrifT7tBPWD8Lubtb5jRrfy9I= github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= @@ -1503,6 +1557,9 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jszwedko/go-datemath v0.1.1-0.20230526204004-640a500621d6 h1:SwcnSwBR7X/5EHJQlXBockkJVIMRVt5yKaesBPMtyZQ= +github.com/jszwedko/go-datemath v0.1.1-0.20230526204004-640a500621d6/go.mod h1:WrYiIuiXUMIvTDAQw97C+9l0CnBmCcvosPjN3XDqS/o= +github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= @@ -1592,6 +1649,8 @@ github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4 github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= github.com/mariomac/guara v0.0.0-20250408105519-1e4dbdfb7136 h1:SOKpjp57SUaZeXPA+wIXTIDByfs65cr1FamFsjzT8Ic= github.com/mariomac/guara v0.0.0-20250408105519-1e4dbdfb7136/go.mod h1:Yolpa1FCtmN9py66WkFE+6xI2ZlRE89zkLeaowPc/g0= +github.com/mattetti/filebuffer v1.0.1 h1:gG7pyfnSIZCxdoKq+cPa8T0hhYtD9NxCdI4D7PTjRLM= +github.com/mattetti/filebuffer v1.0.1/go.mod h1:YdMURNDOttIiruleeVr6f56OrMc+MydEnTcXwtkxNVs= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= @@ -1612,6 +1671,7 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= @@ -1675,6 +1735,16 @@ github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c/go.mod h1 github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mithrandie/csvq v1.18.1 h1:f7NB2scbb7xx2ffPduJ2VtZ85RpWXfvanYskAkGlCBU= +github.com/mithrandie/csvq v1.18.1/go.mod h1:MRJj7AtcXfk7jhNGxLuJGP3LORmh4lpiPWxQ7VyCRn8= +github.com/mithrandie/csvq-driver v1.7.0 h1:ejiavXNWwTPMyr3fJFnhcqd1L1cYudA0foQy9cZrqhw= +github.com/mithrandie/csvq-driver v1.7.0/go.mod h1:HcN3xL9UCJnBYA/AIQOOB/KlyfXAiYr5yxDmiwrGk5o= +github.com/mithrandie/go-file/v2 v2.1.0 h1:XA5Tl+73GXMDvgwSE3Sg0uC5FkLr3hnXs8SpUas0hyg= +github.com/mithrandie/go-file/v2 v2.1.0/go.mod h1:9YtTF3Xo59GqC1Pxw6KyGVcM/qubAMlxVsqI/u9r++c= +github.com/mithrandie/go-text v1.6.0 h1:8gOXTMPbMY8DJbKMTv8kHhADcJlDWXqS/YQH4SyWO6s= +github.com/mithrandie/go-text v1.6.0/go.mod h1:xCgj1xiNbI/d4xA9sLVvXkjh5B2tNx2ZT2/3rpmh8to= +github.com/mithrandie/ternary v1.1.1 h1:k/joD6UGVYxHixYmSR8EGgDFNONBMqyD373xT4QRdC4= +github.com/mithrandie/ternary v1.1.1/go.mod h1:0D9Ba3+09K2TdSZO7/bFCC0GjSXetCvYuYq0u8FY/1g= github.com/mna/redisc v1.4.0 h1:rBKXyGO/39SGmYoRKCyzXcBpoMMKqkikg8E1G8YIfSA= github.com/mna/redisc v1.4.0/go.mod h1:CplIoaSTDi5h9icnj4FLbRgHoNKCHDNJDVRztWDGeSQ= github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= @@ -1728,6 +1798,8 @@ github.com/ncabatoff/go-seq v0.0.0-20180805175032-b08ef85ed833 h1:t4WWQ9I797y7QU github.com/ncabatoff/go-seq v0.0.0-20180805175032-b08ef85ed833/go.mod h1:0CznHmXSjMEqs5Tezj/w2emQoM41wzYM9KpDKUHPYag= github.com/ncabatoff/process-exporter v0.8.7 h1:V+Xtlq7Q9ticzNtkIR9fUlyNxD+rQLs1P8qzumsCWQI= github.com/ncabatoff/process-exporter v0.8.7/go.mod h1:tzUO/+OadS/ynh8xu2lO66zb72a8x0VrIWLPddKGilU= +github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= +github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/nicolai86/scaleway-sdk v1.10.2-0.20180628010248-798f60e20bb2 h1:BQ1HW7hr4IVovMwWg0E0PYcyW8CzqDcVmaew9cujU4s= github.com/nicolai86/scaleway-sdk v1.10.2-0.20180628010248-798f60e20bb2/go.mod h1:TLb2Sg7HQcgGdloNxkrmtgDNR9uVYF3lfdFIN4Ro6Sk= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= @@ -1736,6 +1808,10 @@ github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oapi-codegen/runtime v1.1.1 h1:EXLHh0DXIJnWhdRPN2w4MXAzFyE4CskzhNLUmtpMYro= github.com/oapi-codegen/runtime v1.1.1/go.mod h1:SK9X900oXmPWilYR5/WKPzt3Kqxn/uS/+lbpREv+eCg= +github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 h1:G7ERwszslrBzRxj//JalHPu/3yz+De2J+4aLtSRlHiY= +github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037/go.mod h1:2bpvgLBZEtENV5scfDFEtB/5+1M4hkQhDQrccEJ/qGw= +github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 h1:bQx3WeLcUWy+RletIKwUIt4x3t8n2SxavmoclizMb8c= +github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90/go.mod h1:y5+oSEHCPT/DGrS++Wc/479ERge0zTFxaF8PbGKcg2o= github.com/ohler55/ojg v1.26.8 h1:njM65m+ej8sLHiFZIhJK9UkwOmDPsUikjGbTgcwu8CU= github.com/ohler55/ojg v1.26.8/go.mod h1:/Y5dGWkekv9ocnUixuETqiL58f+5pAsUfg5P8e7Pa2o= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= @@ -2000,6 +2076,8 @@ github.com/percona/mongodb_exporter v0.45.1-0.20250630080259-d761c954bba6 h1:y+V github.com/percona/mongodb_exporter v0.45.1-0.20250630080259-d761c954bba6/go.mod h1:nPxDTzLRQi+IMVJ/KyfxUVXa7LuvSl+iXsXp0BSBoCk= github.com/percona/percona-backup-mongodb v1.8.1-0.20250218045950-7e9f38fe06ab h1:PtSaYWf4AYpVjzn2+IX8aGu1FCQkx7GeRFXiUqFButw= github.com/percona/percona-backup-mongodb v1.8.1-0.20250218045950-7e9f38fe06ab/go.mod h1:HRKf8nO4SqtNJ1oNzfY3THcwIsjGTWGBF3rNz1TwA9c= +github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= +github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= github.com/peterbourgon/ff/v3 v3.4.0 h1:QBvM/rizZM1cB0p0lGMdmR7HxZeI/ZrBWB4DqLkMUBc= github.com/peterbourgon/ff/v3 v3.4.0/go.mod h1:zjJVUhx+twciwfDl0zBcFzl4dW8axCRyXE/eKY9RztQ= github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 h1:Ii+DKncOVM8Cu1Hc+ETb5K+23HdAMvESYE3ZJ5b5cMI= @@ -2148,6 +2226,7 @@ github.com/rfratto/go-yaml v0.0.0-20211119180816-77389c3526dc/go.mod h1:rMzeXFmW github.com/rhnvrm/simples3 v0.6.1/go.mod h1:Y+3vYm2V7Y4VijFoJHHTrja6OgPrJ2cBti8dPGkC3sA= github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= @@ -2164,6 +2243,8 @@ github.com/rs/zerolog v1.4.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKk github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -2178,6 +2259,7 @@ github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0 github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/scaleway/scaleway-sdk-go v1.0.0-beta.34 h1:48+VFHsyVcAHIN2v1Ao9v1/RkjJS5AwctFucBrfYNIA= github.com/scaleway/scaleway-sdk-go v1.0.0-beta.34/go.mod h1:zFWiHphneiey3s8HOtAEnGrRlWivNaxW5T6d5Xfco7g= +github.com/scylladb/termtables v0.0.0-20191203121021-c4c0b6d42ff4/go.mod h1:C1a7PQSMz9NShzorzCiG2fk9+xuCgLkPeCvMHYR2OWg= github.com/sean-/conswriter v0.0.0-20180208195008-f5ae3917a627/go.mod h1:7zjs06qF79/FKAJpBvFx3P8Ww4UTIMAe+lpNXDHziac= github.com/sean-/pager v0.0.0-20180208200047-666be9bf53b5/go.mod h1:BeybITEsBEg6qbIiqJ6/Bqeq25bCLbL7YFmpaFfJDuM= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= @@ -2207,6 +2289,7 @@ github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c h1:aqg5Vm5dwtvL+YgDpBcK1ITf3o96N/K7/wsRXQnUTEs= github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c/go.mod h1:owqhoLW1qZoYLZzLnBw+QkPP9WZnjlSWihhxAJC1+/M= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/shurcooL/vfsgen v0.0.0-20230704071429-0000e147ea92 h1:OfRzdxCzDhp+rsKWXuOO2I/quKMJ/+TQwVbIP/gltZg= github.com/shurcooL/vfsgen v0.0.0-20230704071429-0000e147ea92/go.mod h1:7/OT02F6S6I7v6WXb+IjhMuZEYfH/RJ5RwEWnEo5BMg= github.com/siebenmann/go-kstat v0.0.0-20210513183136-173c9b0a9973 h1:GfSdC6wKfTGcgCS7BtzF5694Amne1pGCSTY252WhlEY= @@ -2225,6 +2308,8 @@ github.com/skeema/knownhosts v1.3.1/go.mod h1:r7KTdC8l4uxWRyK2TpQZ/1o5HaSzh06ePQ github.com/smarty/assertions v1.15.0 h1:cR//PqUBUiQRakZWqBiFFQ9wb8emQGDb0HeGdqGByCY= github.com/smarty/assertions v1.15.0/go.mod h1:yABtdzeQs6l1brC900WlRNwj6ZR55d7B+E8C6HtKdec= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.8.1 h1:qGjIddxOk4grTu9JPOU31tVfq3cNdBlNa5sSznIX1xY= github.com/smartystreets/goconvey v1.8.1/go.mod h1:+/u4qLyY6x1jReYOp7GOM2FSt8aP9CzCZL03bI28W60= @@ -2289,6 +2374,7 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807 h1:LUsDduamlucuNnWcaTbXQ6aLILFcLXADpOzeEH3U+OI= @@ -2364,9 +2450,22 @@ github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMW github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/unknwon/bra v0.0.0-20200517080246-1e3013ecaff8 h1:aVGB3YnaS/JNfOW3tiHIlmNmTDg618va+eT0mVomgyI= +github.com/unknwon/bra v0.0.0-20200517080246-1e3013ecaff8/go.mod h1:fVle4kNr08ydeohzYafr20oZzbAkhQT39gKK/pFQ5M4= +github.com/unknwon/com v1.0.1 h1:3d1LTxD+Lnf3soQiD4Cp/0BRB+Rsa/+RTvz8GMMzIXs= +github.com/unknwon/com v1.0.1/go.mod h1:tOOxU81rwgoCLoOVVPHb6T/wt8HZygqH5id+GNnlCXM= +github.com/unknwon/log v0.0.0-20150304194804-e617c87089d3/go.mod h1:1xEUf2abjfP92w2GZTV+GgaRxXErwRXcClbUwrNJffU= +github.com/unknwon/log v0.0.0-20200308114134-929b1006e34a h1:vcrhXnj9g9PIE+cmZgaPSwOyJ8MAQTRmsgGrB0x5rF4= +github.com/unknwon/log v0.0.0-20200308114134-929b1006e34a/go.mod h1:1xEUf2abjfP92w2GZTV+GgaRxXErwRXcClbUwrNJffU= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.17 h1:SYzXoiPfQjHBbkYxbew5prZHS1TOLT3ierW8SYLqtVQ= +github.com/urfave/cli v1.22.17/go.mod h1:b0ht0aqgH/6pBYzzxURyrM4xXNgsoT/n2ZzwQiEhNVo= github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ= github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= github.com/vertica/vertica-sql-go v1.3.3 h1:fL+FKEAEy5ONmsvya2WH5T8bhkvY27y/Ik3ReR2T+Qw= @@ -2421,6 +2520,8 @@ github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQ github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xiatechs/jsonata-go v1.8.8 h1:YTeJU8rG4oPU2Xn2z8bCO6w8Tg9ik9JiSambGbQlInA= +github.com/xiatechs/jsonata-go v1.8.8/go.mod h1:+9C5kah6Dbq0+ECyywWFxxCm7gjSBbHPvc1rLmkWOVE= github.com/xo/dburl v0.20.0 h1:v601OhM9J4Zh56R270ncM9HRgoxp39tf9+nt5ft9UD0= github.com/xo/dburl v0.20.0/go.mod h1:B7/G9FGungw6ighV8xJNwWYQPMfn3gsi2sn5SE8Bzco= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= @@ -2652,18 +2753,18 @@ go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.45 go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.45.0/go.mod h1:LOjFy00/ZMyMYfKFPta6kZe2cDUc1sNo/qtv1pSORWA= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0 h1:rbRJ8BBoVMsQShESYZ0FkvcITu8X8QNwJogcLUmDNNw= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0/go.mod h1:ru6KHrNtNHxM4nD/vd6QrLVWgKhxPYgblq4VAtNawTQ= -go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.61.0 h1:lREC4C0ilyP4WibDhQ7Gg2ygAQFP8oR07Fst/5cafwI= -go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.61.0/go.mod h1:HfvuU0kW9HewH14VCOLImqKvUgONodURG7Alj/IrnGI= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.62.0 h1:wCeciVlAfb5DC8MQl/DlmAv/FVPNpQgFvI/71+hatuc= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.62.0/go.mod h1:WfEApdZDMlLUAev/0QQpr8EJ/z0VWDKYZ5tF5RH5T1U= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY= go.opentelemetry.io/contrib/otelconf v0.16.0 h1:mTYGRlZtpc/zDaTaUQSnsZ1hyoRONaS4Od/Ny5++lhE= go.opentelemetry.io/contrib/otelconf v0.16.0/go.mod h1:gnsljuyDyVDg39vUvXKj0BVCiVaokN3b8N5BL/ab8fQ= go.opentelemetry.io/contrib/propagators/b3 v1.37.0 h1:0aGKdIuVhy5l4GClAjl72ntkZJhijf2wg1S7b5oLoYA= go.opentelemetry.io/contrib/propagators/b3 v1.37.0/go.mod h1:nhyrxEJEOQdwR15zXrCKI6+cJK60PXAkJ/jRyfhr2mg= -go.opentelemetry.io/contrib/propagators/jaeger v1.35.0 h1:UIrZgRBHUrYRlJ4V419lVb4rs2ar0wFzKNAebaP05XU= -go.opentelemetry.io/contrib/propagators/jaeger v1.35.0/go.mod h1:0ciyFyYZxE6JqRAQvIgGRabKWDUmNdW3GAQb6y/RlFU= -go.opentelemetry.io/contrib/samplers/jaegerremote v0.30.0 h1:bQ1Gvah4Sp8z7epSkgJaNTuZm7sutfA6Fji2/7cKFMc= -go.opentelemetry.io/contrib/samplers/jaegerremote v0.30.0/go.mod h1:9b8Q9rH52NgYH3ShiTFB5wf18Vt3RTH/VMB7LDcC1ug= +go.opentelemetry.io/contrib/propagators/jaeger v1.37.0 h1:pW+qDVo0jB0rLsNeaP85xLuz20cvsECUcN7TE+D8YTM= +go.opentelemetry.io/contrib/propagators/jaeger v1.37.0/go.mod h1:x7bd+t034hxLTve1hF9Yn9qQJlO/pP8H5pWIt7+gsFM= +go.opentelemetry.io/contrib/samplers/jaegerremote v0.31.0 h1:l8XCsDh7L6Z7PB+vlw1s4ufNab+ayT2RMNdvDE/UyPc= +go.opentelemetry.io/contrib/samplers/jaegerremote v0.31.0/go.mod h1:XAOSk4bqj5vtoiY08bexeiafzxdXeLlxKFnwscvn8Fc= go.opentelemetry.io/contrib/zpages v0.62.0 h1:9fUYTLmrK0x/lweM2uM+BOx069jLx8PxVqWhegGJ9Bo= go.opentelemetry.io/contrib/zpages v0.62.0/go.mod h1:C8kXoiC1Ytvereztus2R+kqdSa6W/MZ8FfS8Zwj+LiM= go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= @@ -2956,6 +3057,7 @@ golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191020152052-9984515f0562/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -3080,6 +3182,7 @@ golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -3249,6 +3352,8 @@ google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +gopkg.in/Knetic/govaluate.v3 v3.0.0 h1:18mUyIt4ZlRlFZAAfVetz4/rzlJs9yhN+U02F4u1AOc= +gopkg.in/Knetic/govaluate.v3 v3.0.0/go.mod h1:csKLBORsPbafmSCGTEh3U7Ozmsuq8ZSIlKk1bcqph0E= gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= @@ -3291,6 +3396,7 @@ gopkg.in/zorkian/go-datadog-api.v2 v2.30.0 h1:umQdVO0Ytx+kYadhuJNjFtDgIsIEBnKrOT gopkg.in/zorkian/go-datadog-api.v2 v2.30.0/go.mod h1:kx0CSMRpzEZfx/nFH62GLU4stZjparh/BRpM89t4XCQ= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -3319,6 +3425,8 @@ k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUy k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8= k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8tmbZBHi4zVsl1Y= k8s.io/utils v0.0.0-20250604170112-4c0f3b243397/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +moul.io/http2curl v1.0.0 h1:6XwpyZOYsgZJrU8exnG87ncVkU1FVCcTRpwzOkTDUi8= +moul.io/http2curl v1.0.0/go.mod h1:f6cULg+e4Md/oW1cYmwW4IWQOVl2lGbmCNGOHvzX2kE= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/internal/component/all/all.go b/internal/component/all/all.go index a0c7f0e39c..f0099c62e4 100644 --- a/internal/component/all/all.go +++ b/internal/component/all/all.go @@ -36,6 +36,7 @@ import ( _ "github.com/grafana/alloy/internal/component/discovery/triton" // Import discovery.triton _ "github.com/grafana/alloy/internal/component/discovery/uyuni" // Import discovery.uyuni _ "github.com/grafana/alloy/internal/component/faro/receiver" // Import faro.receiver + _ "github.com/grafana/alloy/internal/component/infinity" // Import infinity _ "github.com/grafana/alloy/internal/component/local/file" // Import local.file _ "github.com/grafana/alloy/internal/component/local/file_match" // Import local.file_match _ "github.com/grafana/alloy/internal/component/loki/echo" // Import loki.echo diff --git a/internal/component/infinity/infinity.go b/internal/component/infinity/infinity.go new file mode 100644 index 0000000000..c5a52c16ec --- /dev/null +++ b/internal/component/infinity/infinity.go @@ -0,0 +1,1421 @@ +package infinity + +import ( + "bytes" + "compress/gzip" + "context" + "encoding/json" + "errors" + "fmt" + "io" + "net/http" + "strings" + "sync" + "time" + + "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" + "github.com/grafana/alloy/internal/component" + "github.com/grafana/alloy/internal/component/common/loki" + "github.com/grafana/alloy/internal/component/common/loki/utils" + "github.com/grafana/alloy/internal/component/prometheus" + "github.com/grafana/alloy/internal/featuregate" + "github.com/grafana/alloy/internal/runtime/logging/level" + "github.com/grafana/alloy/internal/service/labelstore" + "github.com/grafana/alloy/syntax/alloytypes" + "github.com/grafana/grafana-infinity-datasource/pkg/httpclient" + ds "github.com/grafana/grafana-infinity-datasource/pkg/infinity" + "github.com/grafana/grafana-infinity-datasource/pkg/models" + "github.com/grafana/grafana-plugin-sdk-go/data" + "github.com/grafana/loki/pkg/push" + "github.com/prometheus/common/model" + "github.com/prometheus/prometheus/model/labels" + "github.com/prometheus/prometheus/storage" + "github.com/stormcat24/protodep/pkg/logger" + "golang.org/x/oauth2" + + "github.com/grafana/grafana-plugin-sdk-go/backend" + backendLog "github.com/grafana/grafana-plugin-sdk-go/backend/log" +) + +func init() { + component.Register(component.Registration{ + Name: "infinity", + Stability: featuregate.StabilityExperimental, + Args: Arguments{}, + Exports: Exports{}, + + Build: func(opts component.Options, args component.Arguments) (component.Component, error) { + return New(opts, args.(Arguments)) + }, + }) +} + +type BasicAuthOptions struct { + UserName string `alloy:"username,attr,optional"` + Password string `alloy:"password,attr,optional"` +} + +type APIKeyType string + +const ( + APIKeyTypeHeader APIKeyType = "header" + APIKeyTypeQuery APIKeyType = "query" +) + +// MarshalText implements encoding.TextMarshaler +func (a APIKeyType) MarshalText() (text []byte, err error) { + return []byte(a), nil +} + +// UnmarshalText implements encoding.TextUnmarshaler +func (a *APIKeyType) UnmarshalText(text []byte) error { + str := string(text) + switch str { + case "header": + *a = APIKeyTypeHeader + case "query": + *a = APIKeyTypeQuery + default: + return fmt.Errorf("unknown api key type: %s", str) + } + + return nil +} + +type APIKeyAuthOptions struct { + Type APIKeyType `alloy:"type,attr,optional"` + Key string `alloy:"key,attr,optional"` + Value string `alloy:"value,attr,optional"` +} + +type BearerTokenAuthOptions struct { + Token string `alloy:"token,attr,optional"` +} + +type AzureBlobCloudType string + +const ( + AzureCloud AzureBlobCloudType = "AzureCloud" + AzureUSGovernmentCloud AzureBlobCloudType = "AzureUSGovernment" + AzureChinaCloud AzureBlobCloudType = "AzureChinaCloud" +) + +// MarshalText implements encoding.TextMarshaler +func (a AzureBlobCloudType) MarshalText() (text []byte, err error) { + return []byte(a), nil +} + +// UnmarshalText implements encoding.TextUnmarshaler +func (a *AzureBlobCloudType) UnmarshalText(text []byte) error { + str := string(text) + switch str { + case "AzureCloud": + *a = AzureCloud + case "AzureUSGovernment": + *a = AzureUSGovernmentCloud + case "AzureChina": + *a = AzureChinaCloud + default: + return fmt.Errorf("unknown azure blob cloud type: %s", str) + } + + return nil +} + +type AzureBlobAuthOptions struct { + CloudType AzureBlobCloudType `alloy:"cloud_type,attr,optional"` + AccountUrl string `alloy:"account_url,attr,optional"` + AccountName string `alloy:"account_name,attr,optional"` + AccountKey string `alloy:"account_key,attr,optional"` +} + +type AWSAuthOptions struct { + Region string `alloy:"region,attr,optional"` + AccessKey string `alloy:"access_key,attr,optional"` + SecretKey string `alloy:"secret_key,attr,optional"` + Service string `alloy:"service,attr,optional"` +} + +type OAuth2Settings struct { + Passthrough bool `alloy:"passthrough,attr,optional"` + + OAuth2Type string `alloy:"oauth2_type,attr,optional"` + ClientID string `alloy:"client_id,attr,optional"` + TokenURL string `alloy:"token_url,attr,optional"` + Email string `alloy:"email,attr,optional"` + PrivateKeyID string `alloy:"private_key_id,attr,optional"` + Subject string `alloy:"subject,attr,optional"` + Scopes []string `alloy:"scopes,attr,optional"` + AuthStyle oauth2.AuthStyle `alloy:"authStyle,attr,optional"` + AuthHeader string `alloy:"authHeader,attr,optional"` + TokenTemplate string `alloy:"tokenTemplate,attr,optional"` +} + +func (o *OAuth2Settings) Convert() models.OAuth2Settings { + if o == nil { + return models.OAuth2Settings{} + } + + return models.OAuth2Settings{ + OAuth2Type: o.OAuth2Type, + ClientID: o.ClientID, + TokenURL: o.TokenURL, + Email: o.Email, + PrivateKeyID: o.PrivateKeyID, + Subject: o.Subject, + Scopes: o.Scopes, + AuthStyle: o.AuthStyle, + AuthHeader: o.AuthHeader, + TokenTemplate: o.TokenTemplate, + } +} + +type TLSConfig struct { + InsecureSkipVerify bool `alloy:"insecure_skip_verify,attr,optional"` + ServerName string `alloy:"server_name,attr,optional"` + TLSClientAuth bool `alloy:"tls_client_auth,attr,optional"` + TLSAuthWithCACert bool `alloy:"tls_auth_with_ca_cert,attr,optional"` + TLSCACert string `alloy:"tls_ca_cert,attr,optional"` + TLSClientCert string `alloy:"tls_client_cert,attr,optional"` + TLSClientKey string `alloy:"tls_client_key,attr,optional"` +} + +type ProxyOptions struct { + ProxyFromEnvironment bool `alloy:"proxy_from_environment,attr,optional"` + ProxyUrl string `alloy:"proxy_url,attr,optional"` + ProxyUserName string `alloy:"proxy_username,attr,optional"` + ProxyPassword string `alloy:"proxy_password,attr,optional"` +} + +type ForwardTo struct { + Logs []loki.LogsReceiver `alloy:"logs,attr,optional"` + Metrics []storage.Appendable `alloy:"metrics,attr,optional"` +} + +// Arguments holds values which are used to configure the infinity component. +type Arguments struct { + // Optional as we expose the content as an export as well, so users may not intent to forward telemetry directly + ForwardTo ForwardTo `alloy:"forward_to,block,optional"` + + AzureBlobAuth *AzureBlobAuthOptions `alloy:"azure_blob_auth,block,optional"` + BasicAuth *BasicAuthOptions `alloy:"basic_auth,block,optional"` + APIKeyAuth *APIKeyAuthOptions `alloy:"api_key_auth,block,optional"` + BearerTokenAuth *BearerTokenAuthOptions `alloy:"bearer_token_auth,block,optional"` + AWSAuth *AWSAuthOptions `alloy:"aws_auth,block,optional"` + OAuth2Settings *OAuth2Settings `alloy:"oauth2_settings,block,optional"` + Proxy *ProxyOptions `alloy:"proxy,block,optional"` + TLS *TLSConfig `alloy:"tls,block,optional"` + + CollectionInterval time.Duration `alloy:"collection_interval,attr,optional"` + Query Query `alloy:"query,block"` + + TimeoutInSeconds int64 `alloy:"timeout_in_seconds,attr,optional"` + + // AllowedHosts []string + // ReferenceData []models.RefData + // CustomHealthCheckEnabled bool + // CustomHealthCheckUrl string + // UnsecuredQueryHandling models.UnsecuredQueryHandlingMode + // PathEncodedURLsEnabled bool + // IgnoreStatusCodeCheck bool + // AllowDangerousHTTPMethods bool + // ProxyOpts is used for Secure Socks Proxy configuration + // ProxyOpts httpclient.Options + // Specific cookies included by Grafana for forwarding + // KeepCookies []string +} + +type QueryType models.QueryType + +func (q QueryType) MarshalText() (text []byte, err error) { + return []byte(q), nil +} + +func (q *QueryType) UnmarshalText(text []byte) error { + str := string(text) + switch str { + case "json": + *q = QueryType(models.QueryTypeJSON) + case "csv": + *q = QueryType(models.QueryTypeCSV) + case "tsv": + *q = QueryType(models.QueryTypeTSV) + case "xml": + *q = QueryType(models.QueryTypeXML) + case "graphql": + *q = QueryType(models.QueryTypeGraphQL) + case "html": + *q = QueryType(models.QueryTypeHTML) + case "uql": + *q = QueryType(models.QueryTypeUQL) + case "groq": + *q = QueryType(models.QueryTypeGROQ) + case "google-sheets": + *q = QueryType(models.QueryTypeGSheets) + default: + return fmt.Errorf("unknown query type: %s", str) + } + + return nil +} + +type InfinityParser models.InfinityParser + +func (p InfinityParser) MarshalText() (text []byte, err error) { + return []byte(p), nil +} + +func (p *InfinityParser) UnmarshalText(text []byte) error { + str := string(text) + switch str { + case "simple": + *p = InfinityParser(models.InfinityParserSimple) + case "backend": + *p = InfinityParser(models.InfinityParserBackend) + case "jq-backend": + *p = InfinityParser(models.InfinityParserJQBackend) + case "uql": + *p = InfinityParser(models.InfinityParserUQL) + case "groq": + *p = InfinityParser(models.InfinityParserGROQ) + default: + return fmt.Errorf("unknown infinity parser: %s", str) + } + + return nil +} + +type URLOptions struct { + Method string `alloy:"method,attr"` // 'GET' | 'POST' | 'PATCH' | 'PUT | 'DELETE' + Params map[string]string `alloy:"params,attr,optional"` + Headers map[string]string `alloy:"headers,attr,optional"` + Body string `alloy:"data,attr,optional"` + BodyType string `alloy:"body_type,attr,optional"` + BodyContentType string `alloy:"body_content_type,attr,optional"` + BodyForm map[string]string `alloy:"body_form,attr,optional"` + BodyGraphQLQuery string `alloy:"body_graphql_query,attr,optional"` + BodyGraphQLVariables string `alloy:"body_graphql_variables,attr,optional"` +} + +type InfinityCSVOptions struct { + Delimiter string `alloy:"delimiter,attr,optional"` + SkipEmptyLines bool `alloy:"skip_empty_lines,attr,optional"` + SkipLinesWithError bool `alloy:"skip_lines_with_error,attr,optional"` + RelaxColumnCount bool `alloy:"relax_column_count,attr,optional"` + Columns string `alloy:"columns,attr,optional"` + Comment string `alloy:"comment,attr,optional"` +} + +type InfinityJSONOptions struct { + RootIsNotArray bool `alloy:"root_is_not_array,attr,optional"` + ColumnNar bool `alloy:"columnar,attr,optional"` +} + +type InfinityColumn struct { + Selector string `alloy:"selector,attr,optional"` + Text string `alloy:"text,attr,optional"` + Type string `alloy:"type,attr,optional"` // "string" | "number" | "timestamp" | "timestamp_epoch" | "timestamp_epoch_s" | "boolean" + TimeStampFormat string `alloy:"timestamp_format,attr,optional"` +} + +type InfinityFilter struct { + Field string `alloy:"field,attr,optional"` + Operator string `alloy:"operator,attr,optional"` + Value []string `alloy:"value,attr,optional"` +} + +type InfinityDataOverride struct { + Values []string `alloy:"values,attr,optional"` + Operator string `alloy:"operator,attr,optional"` + Override string `alloy:"override,attr,optional"` +} + +type Transformation models.Transformation + +func (t Transformation) MarshalText() (text []byte, err error) { + return []byte(t), nil +} + +func (t *Transformation) UnmarshalText(text []byte) error { + str := string(text) + switch str { + case "noop": + *t = Transformation(models.NoOpTransformation) + case "limit": + *t = Transformation(models.LimitTransformation) + case "filterExpression": + *t = Transformation(models.FilterExpressionTransformation) + case "summarize": + *t = Transformation(models.SummarizeTransformation) + case "computedColumn": + *t = Transformation(models.ComputedColumnTransformation) + default: + return fmt.Errorf("unknown transformation: %s", str) + } + + return nil +} + +type TransformationItem struct { + Type Transformation `yaml:"type,attr,optional"` + Disabled bool `yaml:"disabled,attr,optional"` + Limit struct { + LimitField int `yaml:"limitField,attr,optional"` + } `yaml:"limit,block,optional"` + FilterExpression struct { + Expression string `yaml:"expression,attr,optional"` + } `yaml:"filterExpression,block,optional"` + Summarize struct { + Expression string `yaml:"expression,attr,optional"` + By string `yaml:"by,attr,optional"` + Alias string `yaml:"alias,attr,optional"` + } `yaml:"summarize,block,optional"` + ComputedColumn struct { + Expression string `yaml:"expression,attr,optional"` + Alias string `yaml:"alias,attr,optional"` + } `yaml:"computedColumn,block,optional"` +} + +type Query struct { + // RefName string `alloy:"reference_name,attr,optional"` + Type QueryType `alloy:"type,attr"` // 'json' | 'json-backend' | 'csv' | 'tsv' | 'xml' | 'graphql' | 'html' | 'uql' | 'groq' | 'series' | 'global' | 'google-sheets' + Format string `alloy:"format,attr"` // 'table' | 'timeseries' | 'logs' | 'dataframe' | 'as-is' | 'node-graph-nodes' | 'node-graph-edges' + Source string `alloy:"source,attr"` // 'url' | 'inline' | 'azure-blob' | 'reference' | 'random-walk' | 'expression' + URL string `alloy:"url,attr,optional"` + URLOptions URLOptions `alloy:"url_options,attr,optional"` + Data string `alloy:"data,attr,optional"` + Parser InfinityParser `alloy:"parser,attr"` // 'simple' | 'backend' | 'jq-backend' | 'uql' | 'groq' + FilterExpression string `alloy:"filter_expression,attr,optional"` + SummarizeExpression string `alloy:"summarize_expression,attr,optional"` + SummarizeBy string `alloy:"summarize_by,attr,optional"` + SummarizeAlias string `alloy:"summarize_alias,attr,optional"` + UQL string `alloy:"uql,attr,optional"` + GROQ string `alloy:"groq,attr,optional"` + CSVOptions InfinityCSVOptions `alloy:"csv_options,attr,optional"` + JSONOptions InfinityJSONOptions `alloy:"json_options,attr,optional"` + RootSelector string `alloy:"root_selector,attr,optional"` + Columns []InfinityColumn `alloy:"column,block,optional"` + ComputedColumns []InfinityColumn `alloy:"computed_column,block,optional"` + Filters []InfinityFilter `alloy:"filter,block,optional"` + SeriesCount int64 `alloy:"series_count,attr,optional"` + Expression string `alloy:"expression,attr,optional"` + Alias string `alloy:"alias,attr,optional"` + DataOverrides []InfinityDataOverride `alloy:"data_override,block,optional"` + // TODO - add google sheets support + // Spreadsheet string `json:"spreadsheet,omitempty"` + // SheetName string `json:"sheetName,omitempty"` + // SheetRange string `json:"sheetRange,omitempty"` + + AzBlobContainerName string `alloy:"azure_container_name,attr,optional"` + AzBlobName string `alloy:"azure_blob_name,attr,optional"` + Transformations []TransformationItem `alloy:"transformation,block,optional"` +} + +func (q *Query) Convert() (models.Query, error) { + query := models.Query{ + Type: models.QueryType(q.Type), + Format: q.Format, + Source: q.Source, + URL: q.URL, + Data: q.Data, + Parser: models.InfinityParser(q.Parser), + FilterExpression: q.FilterExpression, + SummarizeExpression: q.SummarizeExpression, + SummarizeBy: q.SummarizeBy, + SummarizeAlias: q.SummarizeAlias, + UQL: q.UQL, + GROQ: q.GROQ, + CSVOptions: models.InfinityCSVOptions{ + Delimiter: q.CSVOptions.Delimiter, + SkipEmptyLines: q.CSVOptions.SkipEmptyLines, + SkipLinesWithError: q.CSVOptions.SkipLinesWithError, + RelaxColumnCount: q.CSVOptions.RelaxColumnCount, + Columns: q.CSVOptions.Columns, + Comment: q.CSVOptions.Comment, + }, + JSONOptions: models.InfinityJSONOptions{ + RootIsNotArray: q.JSONOptions.RootIsNotArray, + ColumnNar: q.JSONOptions.ColumnNar, + }, + RootSelector: q.RootSelector, + SeriesCount: q.SeriesCount, + Expression: q.Expression, + Alias: q.Alias, + DataOverrides: []models.InfinityDataOverride{}, + AzBlobContainerName: q.AzBlobContainerName, + AzBlobName: q.AzBlobName, + } + + for _, col := range q.Columns { + query.Columns = append(query.Columns, models.InfinityColumn{ + Selector: col.Selector, + Text: col.Text, + Type: col.Type, + TimeStampFormat: col.TimeStampFormat, + }) + } + + for _, col := range q.ComputedColumns { + query.ComputedColumns = append(query.ComputedColumns, models.InfinityColumn{ + Selector: col.Selector, + Text: col.Text, + Type: col.Type, + TimeStampFormat: col.TimeStampFormat, + }) + } + + for _, filter := range q.Filters { + query.Filters = append(query.Filters, models.InfinityFilter{ + Field: filter.Field, + Operator: filter.Operator, + Value: filter.Value, + }) + } + + for _, override := range q.DataOverrides { + query.DataOverrides = append(query.DataOverrides, models.InfinityDataOverride{ + Values: override.Values, + Operator: override.Operator, + Override: override.Override, + }) + } + + for _, t := range q.Transformations { + if t.Disabled { + continue + } + + tr := models.TransformationItem{ + Type: models.Transformation(t.Type), + } + + switch tr.Type { + case models.LimitTransformation: + tr.Limit = struct { + LimitField int `json:"limitField,omitempty"` + }{ + LimitField: t.Limit.LimitField, + } + case models.FilterExpressionTransformation: + tr.FilterExpression = struct { + Expression string "json:\"expression,omitempty\"" + }{ + Expression: t.FilterExpression.Expression, + } + case models.SummarizeTransformation: + tr.Summarize = struct { + Expression string "json:\"expression,omitempty\"" + By string "json:\"by,omitempty\"" + Alias string "json:\"alias,omitempty\"" + }{ + Expression: t.Summarize.Expression, + By: t.Summarize.By, + Alias: t.Summarize.Alias, + } + case models.ComputedColumnTransformation: + tr.ComputedColumn = struct { + Expression string "json:\"expression,omitempty\"" + Alias string "json:\"alias,omitempty\"" + }{ + Expression: t.ComputedColumn.Expression, + Alias: t.ComputedColumn.Alias, + } + } + + query.Transformations = append(query.Transformations, tr) + } + + // URLOptions + method := strings.ToUpper(strings.TrimSpace(q.URLOptions.Method)) + if method == "" { + method = "GET" + } + if method != "GET" && method != "POST" && method != "PUT" && method != "PATCH" && method != "DELETE" { + return query, fmt.Errorf("invalid method %s provided. supported methods are GET, POST, PUT, PATCH and DELETE", method) + } + query.URLOptions.Method = method + query.URLOptions.Params = make([]models.URLOptionKeyValuePair, 0, len(q.URLOptions.Params)) + query.URLOptions.Headers = make([]models.URLOptionKeyValuePair, 0, len(q.URLOptions.Headers)) + query.URLOptions.Body = q.URLOptions.Body + query.URLOptions.BodyType = q.URLOptions.BodyType + query.URLOptions.BodyContentType = q.URLOptions.BodyContentType + query.URLOptions.BodyForm = make([]models.URLOptionKeyValuePair, 0, len(q.URLOptions.BodyForm)) + query.URLOptions.BodyGraphQLQuery = q.URLOptions.BodyGraphQLQuery + query.URLOptions.BodyGraphQLVariables = q.URLOptions.BodyGraphQLVariables + + for k, v := range q.URLOptions.Headers { + query.URLOptions.Headers = append(query.URLOptions.Headers, models.URLOptionKeyValuePair{ + Key: k, + Value: v, + }) + } + + for k, v := range q.URLOptions.Params { + query.URLOptions.Params = append(query.URLOptions.Params, models.URLOptionKeyValuePair{ + Key: k, + Value: v, + }) + } + + for k, v := range q.URLOptions.BodyForm { + query.URLOptions.BodyForm = append(query.URLOptions.BodyForm, models.URLOptionKeyValuePair{ + Key: k, + Value: v, + }) + } + + return query, nil +} + +// DefaultArguments provides the default arguments for the infinity +// component. +var DefaultArguments = Arguments{ + CollectionInterval: 60 * time.Second, +} + +// SetToDefault implements syntax.Defaulter. +func (a *Arguments) SetToDefault() { + *a = DefaultArguments +} + +func (a *Arguments) ConvertToInfinity() models.InfinitySettings { + s := models.InfinitySettings{ + AuthenticationMethod: models.AuthenticationMethodNone, + // URL: a.URL, + // CustomHeaders: a.CustomHeaders, + // SecureQueryFields: a.SecureQueryFields, + } + + if a.TLS != nil { + s.TLSAuthWithCACert = a.TLS.TLSAuthWithCACert + s.TLSCACert = a.TLS.TLSCACert + s.TLSClientCert = a.TLS.TLSClientCert + s.TLSClientKey = a.TLS.TLSClientKey + s.InsecureSkipVerify = a.TLS.InsecureSkipVerify + s.ServerName = a.TLS.ServerName + s.TLSClientAuth = a.TLS.TLSClientAuth + } + + if a.Proxy != nil { + if a.Proxy.ProxyFromEnvironment == true { + s.ProxyType = models.ProxyTypeEnv + } else { + s.ProxyType = models.ProxyTypeUrl + s.ProxyUrl = a.Proxy.ProxyUrl + s.ProxyUserName = a.Proxy.ProxyUserName + s.ProxyUserPassword = a.Proxy.ProxyPassword + } + } + + if a.BasicAuth != nil { + s.AuthenticationMethod = models.AuthenticationMethodBasic + s.BasicAuthEnabled = true + s.UserName = a.BasicAuth.UserName + s.Password = a.BasicAuth.Password + } else if a.BearerTokenAuth != nil { + s.AuthenticationMethod = models.AuthenticationMethodBearerToken + s.BearerToken = a.BearerTokenAuth.Token + } else if a.OAuth2Settings != nil { + if a.OAuth2Settings.Passthrough { + s.AuthenticationMethod = models.AuthenticationMethodForwardOauth + } else { + s.AuthenticationMethod = models.AuthenticationMethodOAuth + s.OAuth2Settings = a.OAuth2Settings.Convert() + } + } else if a.APIKeyAuth != nil { + s.AuthenticationMethod = models.AuthenticationMethodApiKey + s.ApiKeyType = string(a.APIKeyAuth.Type) + s.ApiKeyKey = a.APIKeyAuth.Key + s.ApiKeyValue = a.APIKeyAuth.Value + } else if a.AWSAuth != nil { + s.AuthenticationMethod = models.AuthenticationMethodAWS + s.AWSSettings = models.AWSSettings{ + Region: a.AWSAuth.Region, + Service: a.AWSAuth.Service, + AuthType: models.AWSAuthTypeKeys, + } + s.AWSAccessKey = a.AWSAuth.AccessKey + s.AWSSecretKey = a.AWSAuth.SecretKey + } else if a.AzureBlobAuth != nil { + s.AuthenticationMethod = models.AuthenticationMethodAzureBlob + s.AzureBlobAccountKey = a.AzureBlobAuth.AccountKey + s.AzureBlobAccountName = a.AzureBlobAuth.AccountName + s.AzureBlobAccountUrl = a.AzureBlobAuth.AccountUrl + s.AzureBlobCloudType = string(a.AzureBlobAuth.CloudType) + } + + return s +} + +// Exports holds values which are exported by the infinity component. +type Exports struct { + Content alloytypes.OptionalSecret `alloy:"content,attr"` +} + +// Component implements the infinity component. +type Component struct { + opts component.Options + + mut sync.Mutex + args Arguments + + healthMut sync.RWMutex + health component.Health + + metricsFanout *prometheus.Fanout + + infinitySettings *models.InfinitySettings + infinityQuery *models.Query + client *http.Client + azClient *azblob.Client + + collectTick *time.Ticker +} + +var ( + _ component.Component = (*Component)(nil) + _ component.HealthComponent = (*Component)(nil) +) + +// New creates a new infinity component. +func New(o component.Options, args Arguments) (*Component, error) { + service, err := o.GetServiceData(labelstore.ServiceName) + if err != nil { + return nil, err + } + ls := service.(labelstore.LabelStore) + c := &Component{ + opts: o, + metricsFanout: prometheus.NewFanout(nil, o.ID, o.Registerer, ls, prometheus.NoopMetadataStore{}), + collectTick: time.NewTicker(args.CollectionInterval), + } + + backend.Logger = loggerHandler{ + Logger: o.Logger, + Lvl: backendLog.Debug, + } + + if err := c.Update(args); err != nil { + return nil, err + } + return c, nil +} + +// Run implements component.Component. +func (c *Component) Run(ctx context.Context) error { + defer func() { + c.mut.Lock() + defer c.mut.Unlock() + if c.collectTick != nil { + c.collectTick.Stop() + } + }() + + for { + select { + case <-ctx.Done(): + return nil + case <-c.collectTick.C: + c.mut.Lock() + + // TODO support multiple queries w/ inlines/etc + output, status, err := c.getResults(ctx) + if err != nil { + c.setHealth(component.Health{ + Health: component.HealthTypeUnhealthy, + Message: err.Error(), + UpdateTime: time.Now(), + }) + level.Error(c.opts.Logger).Log("msg", "infinity component query failed", "status", status, "output", output, "error", err) + c.mut.Unlock() + continue + } + + if status >= 200 && status < 300 { + c.setHealth(component.Health{ + Health: component.HealthTypeHealthy, + Message: fmt.Sprintf("Last query was successful. Status code: %d", status), + UpdateTime: time.Now(), + }) + // level.Debug(c.opts.Logger).Log("msg", "infinity component query successful", "status", status, "output", output) + } else { + c.setHealth(component.Health{ + Health: component.HealthTypeUnhealthy, + Message: fmt.Sprintf("Last query was unsuccessful. Status code: %d", status), + UpdateTime: time.Now(), + }) + level.Error(c.opts.Logger).Log("msg", "infinity component query failed", "status", status, "output", output) + c.mut.Unlock() + continue + } + + frame, err := c.parseResponse(ctx, output) + // b, _ := frame.MarshalJSON() + // level.Debug(c.opts.Logger).Log("msg", "infinity component parsed response", "frame", string(b)) + + if frame.Meta.Type.IsLogs() { + logs, err := convertFrameToLokiEntries(frame) + if err != nil { + level.Error(c.opts.Logger).Log("msg", "error converting frame to loki entries", "error", err) + c.mut.Unlock() + continue + } + for _, r := range c.args.ForwardTo.Logs { + if r == nil { + continue + } + for _, l := range logs { + r.Chan() <- l + } + } + level.Debug(c.opts.Logger).Log("msg", "forwarded logs", "count", len(logs)) + } else if frame.Meta.Type.IsTimeSeries() || frame.Meta.Type.IsNumeric() { + var metrics []sample + var err error + if frame.Meta.Type.IsTimeSeries() { + metrics, err = c.convertTimeSeriesFrameToSamples(frame) + } else { + metrics, err = c.convertNumericFrameToSamples(frame, time.Now()) + } + if err != nil { + level.Error(c.opts.Logger).Log("msg", "error converting frame to metrics", "error", err) + c.mut.Unlock() + continue + } + if len(metrics) == 0 { + level.Debug(c.opts.Logger).Log("msg", "no metrics parsed from the response") + c.mut.Unlock() + continue + } + + app := c.metricsFanout.Appender(ctx) + appended := map[uint64]struct{}{} + for _, m := range metrics { + // level.Debug(c.opts.Logger).Log("msg", "forwarding metric", "labels", fmt.Sprintf("%v", m.labels), "timestamp", m.timestamp, "value", m.value) + // Avoid appending same metric multiple times in one batch as it can cause errors in some other components like otelcol.prometheus.receiver + hash := m.labels.Hash() + if _, ok := appended[hash]; ok { + err := app.Commit() + if err != nil { + level.Error(c.opts.Logger).Log("msg", "error committing to appender", "error", err) + } + app = c.metricsFanout.Appender(ctx) + appended = map[uint64]struct{}{} + } + _, err := app.Append(0, m.labels, m.timestamp.Unix(), m.value) + if err != nil { + level.Error(c.opts.Logger).Log("msg", "error appending metric", "error", err) + app.Rollback() + break + } + appended[hash] = struct{}{} + if err = app.Commit(); err != nil { + level.Error(c.opts.Logger).Log("msg", "error committing to appender", "error", err) + break + } + } + level.Debug(c.opts.Logger).Log("msg", "forwarded metrics", "count", len(metrics)) + } else { + level.Info(c.opts.Logger).Log("msg", "unsupported frame type", "type", frame.Meta.Type) + } + c.mut.Unlock() + } + } +} + +func (c *Component) getResults(ctx context.Context) (any, int, error) { + if c.args.Query.Source == "azure-blob" { + return c.getAzureBlob(ctx) + } else { + return c.getHTTPResponse(ctx) + } +} + +func (c *Component) getAzureBlob(ctx context.Context) (any, int, error) { + if strings.TrimSpace(c.args.Query.AzBlobContainerName) == "" || strings.TrimSpace(c.args.Query.AzBlobName) == "" { + return nil, http.StatusBadRequest, errors.New("invalid/empty container name/blob name") + } + if c.azClient == nil { + return nil, http.StatusInternalServerError, errors.New("invalid azure blob client") + } + blobDownloadResponse, err := c.azClient.DownloadStream(ctx, strings.TrimSpace(c.args.Query.AzBlobContainerName), strings.TrimSpace(c.args.Query.AzBlobName), nil) + if err != nil { + return nil, http.StatusInternalServerError, err + } + reader := blobDownloadResponse.Body + bodyBytes, err := io.ReadAll(reader) + if err != nil { + return nil, http.StatusInternalServerError, fmt.Errorf("error reading blob content. %s", err) + } + bodyBytes = removeBOMContent(bodyBytes) + if ds.CanParseAsJSON(models.QueryType(c.args.Query.Type), http.Header{}) { + var out any + err := json.Unmarshal(bodyBytes, &out) + if err != nil { + logger.Error("error un-marshaling blob content", "error", err.Error()) + } + return out, http.StatusOK, err + } + return string(bodyBytes), http.StatusOK, nil +} + +func (c *Component) getHTTPResponse(ctx context.Context) (any, int, error) { + body := ds.GetQueryBody(ctx, *c.infinityQuery) + headers := map[string]string{} + req, err := ds.GetRequest(ctx, nil, *c.infinitySettings, body, *c.infinityQuery, headers, true) + if err != nil { + return nil, http.StatusInternalServerError, fmt.Errorf("error preparing request. %w", err) + } + if req == nil { + return nil, http.StatusInternalServerError, fmt.Errorf("error preparing request. invalid request constructed") + } + startTime := time.Now() + if !ds.CanAllowURL(req.URL.String(), c.infinitySettings.AllowedHosts) { + //logger.Debug("url is not in the allowed list. make sure to match the base URL with the settings", "url", req.URL.String()) + return nil, http.StatusUnauthorized, models.ErrInvalidConfigHostNotAllowed + } + //logger.Debug("requesting URL", "host", req.URL.Hostname(), "url_path", req.URL.Path, "method", req.Method, "type", query.Type) + res, err := c.client.Do(req) + duration := time.Since(startTime) + level.Debug(c.opts.Logger).Log("msg", "received response", "host", req.URL.Hostname(), "url_path", req.URL.Path, "method", req.Method, "type", c.infinityQuery.Type, "duration_ms", duration.Milliseconds()) + if res != nil { + defer func() { + if err := res.Body.Close(); err != nil { + logger.Warn("error closing response body", "error", err.Error()) + } + }() + } + if err != nil { + if res != nil { + level.Debug(c.opts.Logger).Log("msg", "error getting response from server", "url", req.URL.String(), "method", req.Method, "error", err.Error(), "status code", res.StatusCode) + // Infinity can query anything and users are responsible for ensuring that endpoint/auth is correct + // therefore any incoming error is considered downstream + return nil, res.StatusCode, fmt.Errorf("error getting response from %s", req.URL.String()) + } + if errors.Is(err, context.Canceled) { + level.Debug(c.opts.Logger).Log("msg", "request cancelled", "url", req.URL.String(), "method", req.Method) + return nil, http.StatusInternalServerError, err + } + level.Debug(c.opts.Logger).Log("msg", "error getting response from server. no response received", "url", req.URL.String(), "error", err.Error()) + return nil, http.StatusInternalServerError, fmt.Errorf("error getting response from url %s. no response received. Error: %w", req.URL.String(), err) + } + if res == nil { + level.Debug(c.opts.Logger).Log("msg", "invalid response from server and also no error", "url", req.URL.String(), "method", req.Method) + return nil, http.StatusInternalServerError, fmt.Errorf("invalid response received for the URL %s", req.URL.String()) + } + if res.StatusCode >= http.StatusBadRequest && !c.infinitySettings.IgnoreStatusCodeCheck { + err = fmt.Errorf("%w\nstatus code : %s", models.ErrUnsuccessfulHTTPResponseStatus, res.Status) + // Infinity can query anything and users are responsible for ensuring that endpoint/auth is correct + // therefore any incoming error is considered downstream + return nil, res.StatusCode, err + } + bodyBytes, err := getBodyBytes(res) + if err != nil { + return nil, res.StatusCode, err + } + if len(bodyBytes) == 0 { + return nil, res.StatusCode, fmt.Errorf("empty response body received for the URL %s", req.URL.String()) + } + bodyBytes = removeBOMContent(bodyBytes) + if ds.CanParseAsJSON(c.infinityQuery.Type, res.Header) { + var out any + err := json.Unmarshal(bodyBytes, &out) + if err != nil { + err = fmt.Errorf("%w. %w", models.ErrParsingResponseBodyAsJson, err) + //logger.Debug("error un-marshaling JSON response", "url", url, "error", err.Error()) + } + return out, res.StatusCode, err + } + return string(bodyBytes), res.StatusCode, err +} + +func getBodyBytes(res *http.Response) ([]byte, error) { + if res == nil || res.Body == nil { + return nil, errors.New("invalid/empty response received from underlying API") + } + if strings.EqualFold(res.Header.Get("Content-Encoding"), "gzip") { + reader, err := gzip.NewReader(res.Body) + if err != nil { + return nil, err + } + defer func() { + _ = reader.Close() + }() + return io.ReadAll(reader) + } + return io.ReadAll(res.Body) +} + +// https://stackoverflow.com/questions/31398044/got-error-invalid-character-%C3%AF-looking-for-beginning-of-value-from-json-unmar +func removeBOMContent(input []byte) []byte { + return bytes.TrimPrefix(input, []byte("\xef\xbb\xbf")) +} + +func (c *Component) parseResponse(ctx context.Context, response any) (*data.Frame, error) { + var frame *data.Frame + var err error + if c.infinityQuery.Type == models.QueryTypeJSON || c.infinityQuery.Type == models.QueryTypeGraphQL { + level.Debug(c.opts.Logger).Log("msg", "parsing response as JSON") + if frame, err = ds.GetJSONBackendResponse(ctx, response, *c.infinityQuery); err != nil { + return frame, err + } + } + if c.infinityQuery.Type == models.QueryTypeCSV || c.infinityQuery.Type == models.QueryTypeTSV { + level.Debug(c.opts.Logger).Log("msg", "parsing response as CSV/TSV") + if responseString, ok := response.(string); ok { + if frame, err = ds.GetCSVBackendResponse(ctx, responseString, *c.infinityQuery); err != nil { + return frame, err + } + } + } + if c.infinityQuery.Type == models.QueryTypeXML || c.infinityQuery.Type == models.QueryTypeHTML { + level.Debug(c.opts.Logger).Log("msg", "parsing response as XML/HTML") + if responseString, ok := response.(string); ok { + if frame, err = ds.GetXMLBackendResponse(ctx, responseString, *c.infinityQuery); err != nil { + return frame, err + } + } + } + + frame, err = ds.PostProcessFrame(ctx, frame, *c.infinityQuery) + if err != nil { + return nil, err + } + + c.checkFrameMetadata(frame) + + return frame, nil +} + +func (c *Component) checkFrameMetadata(frame *data.Frame) { + if frame == nil { + return + } + + if frame.Meta.Type.IsKnownType() { + // type is already set + return + } + + switch c.infinityQuery.Format { + case "logs": + frame.Meta.Type = data.FrameTypeLogLines + frame.Meta.TypeVersion = data.FrameTypeVersion{0, 0} + case "timeseries": + schema := frame.TimeSeriesSchema() + switch schema.Type { + case data.TimeSeriesTypeLong: + frame.Meta.Type = data.FrameTypeTimeSeriesLong + frame.Meta.TypeVersion = data.FrameTypeVersion{0, 0} + case data.TimeSeriesTypeWide: + frame.Meta.Type = data.FrameTypeTimeSeriesWide + frame.Meta.TypeVersion = data.FrameTypeVersion{0, 0} + } + } +} + +// Update implements component.Component. +func (c *Component) Update(args component.Arguments) error { + newArgs := args.(Arguments) + + c.mut.Lock() + defer c.mut.Unlock() + c.args = newArgs + + c.collectTick.Reset(c.args.CollectionInterval) + + c.metricsFanout.UpdateChildren(c.args.ForwardTo.Metrics) + + settings := newArgs.ConvertToInfinity() + err := settings.Validate() + if err != nil { + return err + } + + c.infinitySettings = &settings + + query, err := newArgs.Query.Convert() + if err != nil { + return fmt.Errorf("error converting query settings. %w", err) + } + + c.infinityQuery = &query + + ctx := context.Background() + client, err := httpclient.GetHTTPClient(ctx, settings) + if err != nil { + return err + } + + if settings.AuthenticationMethod == models.AuthenticationMethodAzureBlob { + azClient, err := createAzureBlobClient(settings) + if err != nil { + return err + } + + c.azClient = azClient + } + + c.client = client + return nil +} + +func createAzureBlobClient(settings models.InfinitySettings) (*azblob.Client, error) { + cred, err := azblob.NewSharedKeyCredential(settings.AzureBlobAccountName, settings.AzureBlobAccountKey) + if err != nil { + return nil, errors.New("invalid azure blob credentials") + } + clientUrl := "https://%s.blob.core.windows.net/" + if settings.AzureBlobAccountUrl != "" { + clientUrl = settings.AzureBlobAccountUrl + } + if strings.Contains(clientUrl, "%s") { + clientUrl = fmt.Sprintf(clientUrl, settings.AzureBlobAccountName) + } + azClient, err := azblob.NewClientWithSharedKeyCredential(clientUrl, cred, nil) + if err != nil { + return nil, fmt.Errorf("error creating azure blob client. %s", err) + } + if azClient == nil { + return nil, errors.New("invalid/empty azure blob client") + } + + return azClient, nil +} + +// CurrentHealth implements component.HealthComponent. +func (c *Component) CurrentHealth() component.Health { + c.healthMut.RLock() + defer c.healthMut.RUnlock() + return c.health +} + +func (c *Component) setHealth(h component.Health) { + c.healthMut.Lock() + defer c.healthMut.Unlock() + c.health = h +} + +// See https://grafana.github.io/dataplane/logs#loglines +func convertFrameToLokiEntries(frame *data.Frame) ([]loki.Entry, error) { + if frame == nil { + return nil, errors.New("invalid/empty frame provided") + } + var entries []loki.Entry + // The first field with name "timestamp" is a time + var timestampField *data.Field + // The first field with name "body" is a log body + var bodyField *data.Field + // The first field with name "severity" is a log level + var severityField *data.Field + // The first field with name "labels" is a set of labels in json.RawMessage encoding + var labelsField *data.Field + // The first field with name "structured_metadata" is a set of structured metadata in json.RawMessage encoding + // This is not according to the spec, but it seems like a reasonable extension + var structuredMetadataField *data.Field + + for _, f := range frame.Fields { + if f.Name == "timestamp" && timestampField == nil { + timestampField = f + } else if f.Name == "body" && bodyField == nil { + bodyField = f + } else if f.Name == "severity" && severityField == nil { + severityField = f + } else if f.Name == "labels" && labelsField == nil { + labelsField = f + } else if f.Name == "structured_metadata" && structuredMetadataField == nil { + structuredMetadataField = f + } + } + + var err error + for i := 0; i < frame.Rows(); i++ { + var entry loki.Entry + if timestampField != nil { + if v, ok := timestampField.At(i).(time.Time); ok { + entry.Timestamp = v + } else { + errors.Join(err, fmt.Errorf("invalid timestamp field at row %d: %v", i, v)) + continue + } + } + if bodyField != nil { + if v, ok := bodyField.At(i).(string); ok { + entry.Line = v + } else { + errors.Join(err, fmt.Errorf("invalid body field at row %d: %v", i, v)) + continue + } + } + if labelsField != nil { + if v, ok := labelsField.At(i).(json.RawMessage); ok { + var m map[string]string + if err := json.Unmarshal(v, &m); err != nil { + errors.Join(err, fmt.Errorf("invalid labels field at row %d: %v", i, err)) + } else { + entry.Labels = utils.ToLabelSet(m) + } + } else { + errors.Join(err, fmt.Errorf("invalid labels field at row %d: %v", i, v)) + } + } + if structuredMetadataField != nil { + if v, ok := structuredMetadataField.At(i).(json.RawMessage); ok { + var m map[string]any + if err := json.Unmarshal(v, &m); err != nil { + errors.Join(err, fmt.Errorf("invalid structured_metadata field at row %d: %v", i, err)) + } else { + for k, v := range m { + v, err := json.Marshal(v) + if err != nil { + errors.Join(err, fmt.Errorf("invalid structured_metadata field at row %d: %v", i, err)) + continue + } + entry.StructuredMetadata = append(entry.StructuredMetadata, push.LabelAdapter{Name: k, Value: string(v)}) + } + } + } else { + errors.Join(err, fmt.Errorf("invalid structured_metadata field at row %d: %v", i, v)) + } + } + if severityField != nil { + if v, ok := severityField.At(i).(string); ok { + entry.Labels[model.LabelName("severity")] = model.LabelValue(v) + } else { + errors.Join(err, fmt.Errorf("invalid severity field at row %d: %v", i, v)) + } + } + entries = append(entries, entry) + } + return entries, err +} + +type sample struct { + labels labels.Labels + timestamp time.Time + value float64 +} + +// See https://grafana.github.io/dataplane/timeseries/ +func (c *Component) convertTimeSeriesFrameToSamples(frame *data.Frame) ([]sample, error) { + if frame == nil { + return nil, errors.New("invalid/empty frame provided") + } + var entries []sample + var errs error + + baseLabels := make(map[string]string, len(frame.Fields)) + baseLabels[model.JobLabel] = c.opts.ID + baseLabels[model.InstanceLabel] = c.opts.ID + + switch frame.Meta.Type { + case data.FrameTypeTimeSeriesLong: + for i := 0; i < frame.Rows(); i++ { + var t time.Time + + for _, f := range frame.Fields { + if (f.Type() == data.FieldTypeTime || f.Type() == data.FieldTypeNullableTime) && t.IsZero() { + ts, err := parseTimestampFromField(f, i) + if err != nil { + errors.Join(errs, err) + continue + } + t = *ts + } else if f.Type() == data.FieldTypeString || f.Type() == data.FieldTypeNullableString { + v, err := parseStringFromField(f, i) + if err != nil { + errors.Join(errs, err) + continue + } + baseLabels[f.Name] = *v + } + } + + if t.IsZero() { + errors.Join(errs, errors.New("missing time field")) + break + } + + for _, f := range frame.Fields { + if f.Type() == data.FieldTypeFloat64 || f.Type() == data.FieldTypeNullableFloat64 { + s, err := parseFloatSampleFromField(f, i, t, baseLabels, false) + if err != nil { + errors.Join(errs, err) + continue + } + if s != nil { + entries = append(entries, *s) + } + } + } + } + case data.FrameTypeTimeSeriesWide, data.FrameTypeTimeSeriesMulti: + var tsField *data.Field + for _, f := range frame.Fields { + if f.Type() == data.FieldTypeTime || f.Type() == data.FieldTypeNullableTime { + tsField = f + break + } + } + if tsField == nil { + return nil, errors.New("missing time field") + } + for i := 0; i < frame.Rows(); i++ { + timestamp, err := parseTimestampFromField(tsField, i) + if err != nil { + errors.Join(errs, err) + continue + } + for _, f := range frame.Fields { + if f.Type() == data.FieldTypeFloat64 || f.Type() == data.FieldTypeNullableFloat64 { + s, err := parseFloatSampleFromField(f, i, *timestamp, baseLabels, true) + if err != nil { + errors.Join(errs, err) + continue + } + if s != nil { + entries = append(entries, *s) + } + } + } + } + } + return entries, errs +} + +// See https://grafana.github.io/dataplane/numeric +func (c *Component) convertNumericFrameToSamples(frame *data.Frame, timestamp time.Time) ([]sample, error) { + if frame == nil { + return nil, errors.New("invalid/empty frame provided") + } + var entries []sample + var errs error + + baseLabels := make(map[string]string, len(frame.Fields)) + baseLabels[model.JobLabel] = c.opts.ID + baseLabels[model.InstanceLabel] = c.opts.ID + + switch frame.Meta.Type { + case data.FrameTypeNumericLong: + for i := 0; i < frame.Rows(); i++ { + // Parse all the labels first + for _, f := range frame.Fields { + if f.Type() == data.FieldTypeString || f.Type() == data.FieldTypeNullableString { + v, err := parseStringFromField(f, i) + if err != nil { + errors.Join(errs, err) + continue + } + baseLabels[f.Name] = *v + } + } + + // Iterate again for all value fields + for _, f := range frame.Fields { + if f.Type() == data.FieldTypeFloat64 || f.Type() == data.FieldTypeNullableFloat64 { + s, err := parseFloatSampleFromField(f, i, timestamp, baseLabels, false) + if err != nil { + errors.Join(errs, err) + continue + } + if s != nil { + entries = append(entries, *s) + } + } + } + } + case data.FrameTypeNumericWide, data.FrameTypeNumericMulti: + for i := 0; i < frame.Rows(); i++ { + for _, f := range frame.Fields { + if f.Type() == data.FieldTypeFloat64 || f.Type() == data.FieldTypeNullableFloat64 { + s, err := parseFloatSampleFromField(f, i, timestamp, baseLabels, true) + if err != nil { + errors.Join(errs, err) + continue + } + if s != nil { + entries = append(entries, *s) + } + } + } + } + } + return entries, errs +} + +func parseFloatSampleFromField(f *data.Field, row int, t time.Time, baseLabels map[string]string, useFieldLabels bool) (*sample, error) { + var value *float64 + if f.Type() == data.FieldTypeFloat64 { + if v, ok := f.At(row).(float64); ok { + value = &v + } else { + return nil, fmt.Errorf("invalid float64 field at row %d: %v", row, f.At(row)) + } + } else if f.Type() == data.FieldTypeNullableFloat64 { + if v, ok := f.At(row).(*float64); ok && v != nil { + value = v + } else if !ok { + return nil, fmt.Errorf("invalid nullable float64 field at row %d: %v", row, f.At(row)) + } + } + if value == nil { + return nil, errors.New("field did not contain value") + } + var l labels.Labels + if useFieldLabels { + l = labels.FromMap(f.Labels) + for k, v := range baseLabels { + l = append(l, labels.Label{ + Name: k, + Value: v, + }) + } + } else { + l = labels.FromMap(baseLabels) + } + l = append(l, labels.Label{ + Name: model.MetricNameLabel, + Value: f.Name, + }) + + s := sample{ + value: *value, + timestamp: t, + labels: l, + } + return &s, nil +} + +func parseTimestampFromField(f *data.Field, row int) (*time.Time, error) { + if f.Type() == data.FieldTypeTime { + if v, ok := f.At(row).(time.Time); ok { + return &v, nil + } else { + return nil, fmt.Errorf("invalid time field at row %d: %v", row, f.At(row)) + } + } else if f.Type() == data.FieldTypeNullableTime { + if v, ok := f.At(row).(*time.Time); ok && v != nil { + return v, nil + } else if !ok { + return nil, fmt.Errorf("invalid nullable time field at row %d: %v", row, f.At(row)) + } + } + return nil, errors.New("field did not contain time") +} + +func parseStringFromField(f *data.Field, row int) (*string, error) { + if f.Type() == data.FieldTypeString { + if v, ok := f.At(row).(string); ok { + return &v, nil + } else { + return nil, fmt.Errorf("invalid string field at row %d: %v", row, f.At(row)) + } + } else if f.Type() == data.FieldTypeNullableString { + if v, ok := f.At(row).(*string); ok && v != nil { + return v, nil + } else if !ok { + return nil, fmt.Errorf("invalid nullable string field at row %d: %v", row, f.At(row)) + } + } + return nil, errors.New("field did not contain string") +} diff --git a/internal/component/infinity/logger.go b/internal/component/infinity/logger.go new file mode 100644 index 0000000000..f12ea25a6e --- /dev/null +++ b/internal/component/infinity/logger.go @@ -0,0 +1,48 @@ +package infinity + +import ( + "context" + + gk "github.com/go-kit/log" + "github.com/grafana/alloy/internal/runtime/logging/level" + backend "github.com/grafana/grafana-plugin-sdk-go/backend/log" +) + +type loggerHandler struct { + Logger gk.Logger + Lvl backend.Level +} + +// Ensure loggerHandler implements backend.Logger +var _ backend.Logger = loggerHandler{} + +func (l loggerHandler) Debug(msg string, args ...interface{}) { + level.Debug(l.Logger).Log(append([]interface{}{"msg", msg}, args)...) +} + +func (l loggerHandler) Info(msg string, args ...interface{}) { + level.Info(l.Logger).Log(append([]interface{}{"msg", msg}, args)...) +} + +func (l loggerHandler) Warn(msg string, args ...interface{}) { + level.Warn(l.Logger).Log(append([]interface{}{"msg", msg}, args)...) +} + +func (l loggerHandler) Error(msg string, args ...interface{}) { + level.Error(l.Logger).Log(append([]interface{}{"msg", msg}, args)...) +} + +func (l loggerHandler) With(args ...interface{}) backend.Logger { + return &loggerHandler{ + Logger: gk.With(l.Logger, args...), + } +} + +func (l loggerHandler) Level() backend.Level { + return l.Lvl +} + +func (l loggerHandler) FromContext(ctx context.Context) backend.Logger { + // This is not important as the context is only intended to return context relevant to running as a Data Source + return l +}